为了代码复用,bash 也提供了函数功能。函数是一个脚本代码块,可以为其命名并在代码中任何位置重用。
bash shell 提供了两种格式来创建函数。一是使用关键字 function 后跟分配给该代码块的函数名。name 属性定义了赋予函数的唯一名称。commands 是构成函数的一条或多条 bash shell 命令。调用函数时,会按命令的顺序依次执行。
function name {
commands
}
第二种格式更接近其它语言中的定义方式。
name() {
commands
}
函数必须在调用语句之前定义,否则将会报错。当 bash 执行到引用函数名时,将跳转到函数的定义并执行那里定义的命令。
zzz@ubuntu:~/my_learning$ cat test1.sh
#!/bin/bash
name
name() {
echo "This is name function."
}
name
zzz@ubuntu:~/my_learning$ ./test1.sh
./test1.sh: 行 3: name:未找到命令
This is name function.
zzz@ubuntu:~/my_learning$
bash shell 函数的返回值和其它语言不同,大致有三种。
默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码。函数执行结束后,可以使用标准变量 $? 来确定函数的退出状态码。也因此,如果函数中最后一条命令之前的语句如果出现错误,函数返回的退出状态码依然为 0 。
zzz@ubuntu:~/my_learning$ cat test2.sh
#!/bin/bash
name() {
# 抛出一个错误
e
echo "This is name function."
}
name
zzz@ubuntu:~/my_learning$ ./test2.sh
./test2.sh: 行 5: e:未找到命令
This is name function.
zzz@ubuntu:~/my_learning$ echo $?
0
zzz@ubuntu:~/my_learning$
bash shell 在 return 处退出函数。return 命令可以指定一个退出状态码来作为函数的退出状态码。指定的退出状态码的值在 0~255之间。
zzz@ubuntu:~/my_learning$ cat test3.sh
#!/bin/bash
name() {
echo "This is name function."
return 15
}
name
echo $?
zzz@ubuntu:~/my_learning$ ./test3.sh
This is name function.
15
zzz@ubuntu:~/my_learning$
可以直接将函数的输出赋值给变量,这样就可以更灵活的处理函数的返回值。
zzz@ubuntu:~/my_learning$ cat test4.sh
#!/bin/bash
name() {
read -p "Enter a value: " value
echo $value
}
result=`name`
echo $result
zzz@ubuntu:~/my_learning$ ./test4.sh
Enter a value: 5
5
zzz@ubuntu:~/my_learning$
bash shell 会将函数当作小型脚本,所以可以像普通脚本那样向函数传递参数。函数可以使用标准的参数环境变量来表示命令行上传给函数的参数。
zzz@ubuntu:~/my_learning$ cat test5.sh
#!/bin/bash
name() {
value=$[ $1 + $2 ]
echo $value
}
echo "$0 parameter: $1, $2"
result=`name $1 $2`
echo $result
zzz@ubuntu:~/my_learning$ ./test5.sh 10 20
./test5.sh parameter: 10, 20
30
zzz@ubuntu:~/my_learning$
函数中定义的变量和普通的变量作用域不同。函数使用两种类型的变量:
zzz@ubuntu:~/my_learning$ cat test6.sh
#!/bin/bash
name() {
local value=$[ ($1 + $2) * $a ]
echo $value
}
a=2
result=`name $1 $2`
echo "value=$value, result=$result"
zzz@ubuntu:~/my_learning$ ./test6.sh 10 20
value=, result=60
zzz@ubuntu:~/my_learning$