函数
函数基本语法
shell 可以用户定义函数,然后在shell脚本中可以随便调用。
格式
[ function ] funname [()]
{
action;
[return int;]
}
说明:
- 前部 function 可省,后面括号不可省
- 写在一行时行尾大括号前要加分号,如
function ccc(){ echo "ccc" ; }
。 - return
-
参数返回可省。return 返回,如果不加,将以最后一条命令运行结果,作为返回值。
-
函数返回值在调用该函数后通过
$?
****来获得。 -
return 后跟数值 n(0-255),超出时将自动除以256取余。若所需值过大可使用echo。return用于返回状态码。约定俗成地,返回码为 0 表示成功,非零值表示失败或错误。
-
Shell中的 return 命令通常用于在函数内部控制流程,并将状态码或结果传递给调用者。
-
return 和 exit 区别
在 Shell 函数中,可以使用 exit 语句来终止函数的执行并返回一个退出状态码。
当函数执行到 exit 语句时,整个脚本将立即停止执行,并将指定的退出状态码返回给调用者
return和exit的区别在于它们的作用范围:return只作用于函数内部,而exit作用于整个脚本。
如果想从函数中返回一个值并继续执行脚本,应该使用return语句;
如果想在任何时候结束整个脚本的执行,应该使用exit语句。
-
示例1
function abc() { # 定义函数,使用echo输出计算结果
read -p "请输入:" a
a=$((a*2)) # 直接输出计算结果
return 0 # 返回状态码0表示成功
}
# 调用函数并将其返回值保存在result变量中
abc
result=$?
# 检查返回值是否为0,并打印result变量的值
if [ $result -eq 0 ]
then
echo "函数返回值为:$result" #应该是0
else
echo "函数执行出错!"
fi
示例2
使用 $?
获得返回值
#!/bin/bash
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
函数传参
在 Shell 中,调用函数时可以向其传递参数。
位置参数用于实现参数传递,使函数能够根据不同的输入执行相应的操作。
在函数内部,通过使用位置参数 $n
来获取参数的值:
- $1表示第一个参数
- $2表示第二个参数的等
- 以此类推
示例1:方式一
交互输入传参
#!/bin/bash
sum1 () {
sum=$[$1 + $2] #推荐sum=$(( $1 + $2 ))
echo $sum
}
read -p "请输入第一个参数:" first
read -p "请输入第二个参数:" second
sum1 $first $second
运行输出
请输入第一个参数:2
请输入第二个参数:3
5
示例2:方式二
调用函数尾部直接跟参数
#!/bin/bash
sum1 () {
sum=$[$1 + $2]
echo $sum
}
sum1 $1 $2
#执行:
[root@localhost aaa]#./test5.sh 10 20
30
函数变量
局部变量和全局变量
- 局部变量:使用
local
声明,作用域仅在函数内部,避免修改全局变量。 - 全局变量:默认情况下,Shell 中的变量是全局的,除非在函数内部用
local
限定为局部变量。
函数的作用范围
- 函数在shell脚本中仅在当前shell环境中有效
示例1:不使用局部变量
函数内部使用不局部变量,变量会被修改。
#!/bin/bash
abc () {
a=5
b=6
return 0
}
a=8
b=12
c=9
abc
echo "a等于$a" # 输出 5,a 被函数 abc 修改。
echo "b等于$b" # 输出 6,同理。
echo "c等于$c" # 输出 9,c 没有被修改。
示例2:使用局部变量
在函数内部使用局部变量,防止全局变量被意外修改。
#!/bin/bash
abc () {
local a=5 # 使用 local 声明局部变量 a b
local b=6
return 0
}
a=8
b=12
c=9
abc
echo "a等于$a" # 输出 8,函数内部的局部变量不影响全局变量 a。
echo "b等于$b" # 输出 12,同理。
echo "c等于$c" # 输出 9,c 没有被修改。
示例3:局部变量不影响全局变量
在函数中使用局部变量,不影响同名的全局变量。
#!/bin/bash
abc () {
local i=8 # 定义局部变量 i,并初始化为 8
echo "inside $i" # 打印局部变量 i 的值
}
i=9 # 定义全局变量 i,并初始化为 9
abc
echo "outside $i" # 打印全局变量 i 的值,输出 9
# 执行结果:
# inside 8
# outside 9
示例4:局部变量声明的顺序和影响
局部变量声明的顺序对全局变量的影响。 Bash 中变量作用域的特性。
#!/bin/bash
abc () {
echo "inside1 $i" # 如果函数外部已定义 i,这里会打印外部的 i 值;否则,i 未定义
let i++ # 尝试增加 i 的值,此时操作的是全局变量 i
local i # 声明局部变量 i,作用域从此开始
i=8 # 局部变量 i 被初始化为 8
echo "inside2: $i" # 打印局部变量 i 的值
}
i=9 # 定义全局变量 i,并初始化为 9
abc
echo "outside $i" # 打印全局变量 i 的值
# 执行结果:
# inside1 9 # 函数外部定义的 i 被打印
# inside2: 8 # 局部变量 i 的值被打印
# outside 10 # 全局变量 i 被 let i++ 修改为 10
返回值调用
Shell脚本中的函数主要通过两种方式来“返回”值给调用者:
-
通过
$?
变量获取退出状态例如,定义一个返回值为2的函数
abc
,并调用它:#!/bin/bash abc() { return 2 } abc echo $? # 输出:2
-
通过标准输出(STDOUT)或标准错误(STDERR)返回更复杂的数据
由于退出状态只能是一个整数,如果需要函数返回更复杂的数据(如字符串、数组等),可通过标准输出(通常是
echo
或printf
命令)或标准错误(如使用>&2
重定向)来“返回”这些数据。在调用函数时,可以通过命令替换(如
$(...)
或反引号...
)来捕获这些输出。例如,定义一个函数返回字符串“Hello, World!”:
#!/bin/bash abc() { echo "Hello, World!" } result=$(abc) echo $result # 输出:Hello, World!