SH脚本基本语法(4)

一、函数

在 Shell 脚本中,函数是一段可重复使用的代码块,它可以接收参数、执行特定任务并返回结果。使用函数能够提高脚本的模块化程度和代码的复用性。

1. 函数定义

1.1 形式一

function 函数名 {
    # 函数体,包含要执行的命令
    命令1
    命令2
    ...
}

示例:

function test {
    echo "Hello, World!"
}

1.2 形式二

函数名() {
    # 函数体,包含要执行的命令
    命令1
    命令2
    ...
}

示例: 

test() {
    echo "Hello, World!"
}

2. 函数调用

定义好函数后,只需使用函数名即可调用该函数。例如,对于上面定义的 test 函数,可以这样调用:

 示例: 

#!/bin/bash
test() {
    echo "Hello, World!"
}

# 调用函数
test

# 运行脚本输出 Hello, World!

3. 参数传递

在调用函数时,可以向函数传递参数。在函数内部,可以使用特殊变量 $1$2$3 ... 来获取传递的参数,其中 $1 表示第一个参数,$2 表示第二个参数,依此类推。$0 表示脚本或函数的名称。

 示例: 

#!/bin/bash
add() {
    sum=$(( $1 + $2 ))
    echo "两数之和为: $sum"
}

# 调用函数并传递参数
add 3 5

# 运行脚本输出 两数之和为: 8

在这个示例中,add 函数接收两个参数,并计算它们的和。调用 add 3 5 时,$1 的值为 3$2 的值为 5

4. 返回值

在 Shell 脚本中,函数的返回值是通过退出状态码来表示的,范围是 0 - 255。可以使用 return 语句来设置函数的返回值。返回值为 0 表示函数执行成功,非 0 表示执行失败。

 示例:

#!/bin/bash
is_even() {
    if [ $(( $1 % 2 )) -eq 0 ]; then
        return 0  # 是偶数,返回 0 表示成功
    else
        return 1  # 不是偶数,返回 1 表示失败
    fi
}

# 调用函数
is_even 4
result=$?  # 获取函数的返回值
if [ $result -eq 0 ]; then
    echo "该数是偶数"
else
    echo "该数是奇数"
fi

# 运行输出 该数是偶数

在这个示例中,is_even 函数用于判断一个数是否为偶数。如果是偶数,使用 return 0 返回 0;否则,使用 return 1 返回 1。调用函数后,使用 $? 获取函数的返回值,并根据返回值输出相应的信息。 

5. 局部变量

在函数内部,可以使用 local 关键字定义局部变量,局部变量只在函数内部可见,不会影响函数外部的同名变量。

  示例:

#!/bin/bash
test_function() {
    local localVar="这是一个局部变量"
    echo $localVar
}

# 调用函数
test_function

# 尝试在函数外部访问局部变量
echo $localVar  # 输出为空,因为 localVar 是局部变量

二、字符串处理

1. 字符串拼接

可以直接将多个字符串放在一起实现拼接,也可以使用变量进行拼接: 

str1="Hello"
str2="World"
# 直接拼接
result1=$str1$str2
echo $result1  
# 输出:HelloWorld

# 带空格拼接
result2="$str1 $str2"
echo $result2  
# 输出:Hello World

2. 字符串长度获取

可以使用 ${#变量名} 来获取字符串的长度:

str="abcdefg"
length=${#str}
echo $length  # 输出:7

3. 字符串截取

可以使用 ${变量名:起始位置:长度} 的语法来截取字符串:

str="abcdefg"
# 从第 0 个位置开始,截取长度为 3 的字符串
sub_str1=${str:0:3}
echo $sub_str1  # 输出:abc

# 从第 3 个位置开始,截取到字符串末尾
sub_str2=${str:3}
echo $sub_str2  # 输出:defg

4. 字符串查找

可以使用 expr index 命令来查找某个字符或子字符串在字符串中首次出现的位置:

str="abcdefg"
# 查找字符 'd' 在字符串中首次出现的位置
pos=$(expr index "$str" d)
echo $pos  # 输出:4 (位置从 1 开始计数)

5. 字符串替换

可以使用 ${变量名/旧字符串/新字符串} 语法来替换字符串中的部分内容,只替换首次出现的匹配项;使用 ${变量名//旧字符串/新字符串} 可以替换所有匹配项:

str="abcabc"
# 只替换首次出现的 'ab'
new_str1=${str/ab/xy}
echo $new_str1  # 输出:xycabc

# 替换所有出现的 'ab'
new_str2=${str//ab/xy}
echo $new_str2  # 输出:xycxyc

6. 字符串掐头去尾

字符串掐头去尾” 指的是删除字符串开头和结尾的特定字符或子串。

6.1 删除开头和结尾的固定长度字符

若要删除字符串开头和结尾固定数量的字符,可借助字符串截取的方式达成。

str="abcdefg"
# 删除开头 2 个字符和结尾 2 个字符
new_str="${str:2:${#str}-4}"
echo $new_str  # 输出: cde

代码解释

  • ${str:2} 表示从字符串的第 2 个位置(索引从 0 开始)开始截取。
  • ${#str} 用于获取字符串的长度,${#str}-4 表示截取的长度为原字符串长度减去 4。

6.2 删除开头和结尾的指定字符或子串

可使用 ${变量名#匹配模式} 和 ${变量名%匹配模式} 分别删除开头和结尾匹配的部分。

str="---abc---"
# 删除开头的 "-"
str="${str#*-}"
# 删除结尾的 "-"
str="${str%-*}"
echo $str  # 输出: abc
  • ${str#*关键词} 从字符串开头开始,删除最短匹配到 - 的部分。
  • ${str%关键词*} 从字符串结尾开始,删除最短匹配到 - 的部分。
  • ${str##*关键词} 从字符串开头开始,删除最长匹配到 - 的部分。
  • ${str%%关键词*} 从字符串结尾开始,删除最长匹配到 - 的部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值