Shell脚本--位置参数
0. 特殊参数
在介绍本章内容之前,先介绍几个特殊变量:
$0 当前脚本的文件名。 $n 传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 $# 传递给脚本或函数的参数个数。 $* 传递给脚本或函数的所有参数。 $@ 传递给脚本或函数的所有参数。不加双引号""时,和$*没有区别,每个参数都是一份数据。但是,"$*"代表所有参数整体上看做一份数据,"$@"代表每个参数仍然都是一份数据。 $? 上个命令的退出状态,或函数的返回值。 $$ 当前Shell进程ID。对于Shell脚本,就是这些脚本所在的进程ID。
1. 给脚本传递位置参数
运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用 $n 的形式来接收。
示例:
#!/bin/bash echo "\$#: $#" echo "\$0: $0" echo "\$1: $1" echo "\$2: $2" echo "\$*: $*" echo "\$@: $@" echo "\$$: $$"
然后执行命令 sh cstring.sh hello world ,其结果为:
$#: 2 $0: cstring.sh $1: hello $2: world $*: hello world $@: hello world $$: 3383
如果参数个数太多,达到或者超过了 9 个,那么就得用 ${10} 的形式来接收了。
2. 给函数传递位置参数
同样,在调用函数时也可以传递参数。Shell 函数参数的传递和其它编程语言不同,没有所谓的形参和实参,在定义函数时也不用指明参数的名字和数目。这些传递进来的参数,在函数内部就也使用 $n 的形式接收。
示例:
#!/bin/bash function foo() { echo "\$#: $#" echo "\$0: $0" echo "\$1: $1" echo "\$2: $2" echo "\$*: $*" echo "\$@: $@" echo "\$$: $$" } foo $1 $2
然后执行命令 sh cstring.sh hello world ,其结果为:
$#: 2 $0: cstring.sh $1: hello $2: world $*: hello world $@: hello world $$: 3401
3. $* 和 $@
在特殊参数已经说明两者区别,下面以示例来演示:
#!/bin/bash echo "\$*: $*" echo "for val in \$*" for val in $* do echo ${val} done echo "for val in \"\$*\"" for val in "$*" do echo ${val} done echo -------------------- echo "\$@: $@" echo "for val in \$@" for val in $@ do echo ${val} done echo "for val in \"\$@\"" for val in "$@" do echo ${val} done
然后执行命令 sh cstring.sh hello world ,其结果为:
$*: hello world for val in $* hello world for val in "$*" hello world -------------------- $@: hello world for val in $@ hello world for val in "$@" hello world