定义 Shell 函数时不能带参数,但是在调用函数时却可以传递参数,这些传递进来的参数,在函数内部就也使用$n的形式接收,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推,注意:$0表示当前文件名。
1. 向脚本文件传递位置参数
编写如下代码,并命名为test.sh
#!/bin/bash
echo "姓名:$1"
echo "性别:$2"
echo "年龄:$3"
echo "身高:$4"
echo "体重:$5"
附带参数执行test.sh,执行结果如下所示:
$ . ./test.sh Crystal 女 24 168cm 53KG
姓名: Crystal
性别:女
年龄:24
身高:168cm
体重:53KG
其中,Crystal是第一个位置参数$1,女 是第二个位置参数$2,依此类推。。。
2. 给函数传递位置参数
将上面脚本内容放到函数里,脚本修改如下:
#!/bin/bash
#定义函数
function func(){
echo "姓名:$1"
echo "性别:$2"
echo "年龄:$3"
echo "身高:$4"
echo "体重:$5"
}
#调用函数
func Crystal 女 24 168cm 53KG
执行脚本文件,执行结果如下所示:
$ . ./test.sh
姓名:Crystal
性别:女
年龄:24
身高:168cm
体重:53KG
注意:本次执行脚本时,没有在命令行传递参数,因为我们定义的函数在文件中被调用时已经传递了位置参数。
3. 特殊变量
除了 $n,Shell 还有几个特殊参数,其参数形式及含义说明如下表所示:
参数 | 说明 |
$$ | 脚本运行的当前进程ID号 |
$# | 传递到脚本的参数个数 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 |
$* | 以一个单字符串显示所有向脚本传递的参数。 如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 也可以用来获取函数返回值,后面会针对特殊的返回结果值给出示例。 |
$0 | 当前文件名 |
了解了以上特殊参数的含义之后,我们通过实例来看一下参数的实际应用效果。
- 示例一:给脚本文件传递参数
- 示例二:给函数传递参数
$* 与 $@ 区别
- 相同点:都表示传递给函数或脚本的所有参数,不被双引号" "包围时,它们都是将接收到的每个参数看做一份数据,参数之间以空格来分隔。
- 不同点:
当他们被双引号" "包围时,
"$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据;
"$@"仍然将每个参数都看作一份数据,彼此之间是独立的。
比如传递了 3 个参数,那么对于"$*"来说,这3个参数会合并到一起形成一份数据,它们之间是无法分割的;而对于"$@"来说,这 3 个参数是相互独立的,它们是 3 份数据。如果使用 echo 直接输出"$*"和"$@"做对比,是看不出区别的;但如果使用 for 循环来逐个输出数据,立即就能看出区别来,如下图所示,$*只遍历了一次,因为它将所有参数当作一份数据,$@则遍历了六次,将参数逐个输出。
- $? 获取函数返回值 或 最后命令的退出状态
1、 获取最后命令的退出状态
一般情况下,命令执行成功会返回0,执行失败则返回1,但是,一些情况下,命令的执行结果也会返回其他值,请看下面的实例。
解释:
执行命令 . ./return.sh 22后,根据函数设置,我们可以看到,参数错误,所以返回值是1;
执行命令 . ./return.sh 222,根据函数设置,我们可以知道,参数正确,所以返回值是0;
执行命令 . ./return.sh,没有给脚本传参,所以脚本执行失败,故而使用命令 echo $? 查看上一命令的执行结果,我们得到返回值0。
2、获取函数返回值
从上面的脚本执行结果中可以看出,函数返回两数相加后的和。