Bash技巧:介绍 $0、$1、 2 、 2、 2、#、 @ 、 @、 @、*、$? 的含义
在编写 Linux bash shell 脚本时,经常会用到 $0、$1、$2、$#、$@、$*、$? 等参数,下面具体说明这些参数的含义。
假设执行 ./test.sh a b c 这样一个命令,则可以使用下面的参数来获取一些值:
•$0 对应 "./test.sh" 这个值。如果执行的是 ./work/test.sh, 则对应 ./work/test.sh 这个值,而不是只返回文件名本身的部分。
•$1 会获取到 a,即 $1 对应传给脚本的第一个参数。
•$2 会获取到 b,即 $2 对应传给脚本的第二个参数。
•$3 会获取到 c,即 $3 对应传给脚本的第三个参数。$4、$5 等参数的含义依此类推。
•$# 会获取到 3,对应传入脚本的参数个数,统计的参数不包括 $0。
•$@ 会获取到 "a" "b" "c",也就是所有参数的列表,不包括 $0。
•$* 也会获取到 "a" "b" "c", 其值和 $@ 相同。但 $* 和 $@ 加上双引号有所不同。"$*" 把所有参数合并成一个字符串,而 "$@" 会得到一个字符串参数数组。
•$? 可以获取到执行 ./test.sh a b c 命令后的返回值。在执行一个前台命令后,可以立即用 $? 获取到该命令的返回值。该命令可以是系统自身的命令,可以是 shell 脚本,也可以是自定义的 bash 函数。0值为执行成功;非0值为执行失败。
变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数(不包含$0)。
$* 传递给脚本或函数的所有参数("$*"会把所有参数当成一个字符串)。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。("$@"会把所有单数当成一个数组。)
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
通过脚本记忆特殊变量:
[root@ k8s-m01 ~] cat test.sh
#!/bin/bash
echo "$0"
echo "$1"
echo "$2"
echo "$3"
echo "$#"
echo "$@"
echo "$*"
echo "$?"
[root@ k8s-m01 ~] sh test.sh a b c
test.sh
a
b
c
3
a b c
a b c
0
下面举例说明 “ ∗ " 和 " *" 和 " ∗"和"@” 的差异。假设有一个 testparams.sh 脚本,内容如下:
[root@ k8s-m01 ~] cat test.sh
#!/bin/bash
for i in "$*"
do
echo '字符串:' $i
done
echo '----分割符----'
for i in "$@"
do
echo '数组:' $i
done
[root@ k8s-m01 ~] sh test.sh a b c
字符串: a b c
----分割符----
数组: a
数组: b
数组: c
可以看到,"$*" 只产生一个字符串,for 循环只遍历一次。
而 "$@" 产生了多个字符串,for 循环遍历多次,是一个字符串参数数组。
注意:
如果传入的参数多于 9 个,则不能使用 $10 来引用第 10 个参数,而是要用${10} 来引用。
即,需要用大括号{}把大于 9 的数字括起来。
例如
${10} 表示获取第 10 个参数的值,写为 $10 获取不到第 10 个参数的值。
实际上,$10 相当于 ${1}0,也就是先获取 $1 的值,后面再跟上 0,如果 $1 的值是 "first",则 $10 的值是 "first0"。