一、函数
在 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%%关键词*}
从字符串结尾开始,删除最长匹配到-
的部分。