Shell特殊变量

$0 当前脚本的文件名
$n

传递给脚本或函数的参数. n是一个数字, 表示第几个参数.

例如, 第一个参数是$1, 第二个参数是$2, 以此类推.

$# 传递给脚本或函数的参数个数.
$* 传递给脚本或函数的所有参数.
$@ 传递给脚本或参数的所有个数. 当被双引号”“包围时, $@与$*稍有不同.
$$ 当前Shell进程ID.
$? 上个命令的退出状态(0表示正确, 其它表示错误), 或函数的返回值.

$*$@的异同

$*$@都表示传递给脚本或函数的所有参数.

$*$@不被双引号""包围时, 它们之间没有任何区别, 都是将接收到的参数看做一个数组("$1", "$2", …, "$N"), 彼此之间用空格分隔.

但是当它们被双引号""包围时, 就会有区别了:

  • $*会将所有的参数从整体上看做一份数据, 而不是把每个参数都看做一份数据("$1 $2 ... $N");
  • $@仍然将每个参数都看做一份数据, 彼此之间时独立的.

如果使用echo直接输出"$*""$@"作对比, 是看不出区别的; 但如果使用for循环来逐个输出数据, 立即就能看出区别来.

Example:

#!/usr/bin/env bash

echo '--- $* 演示 ---'
for i in "$*"
do
    echo $i
done

echo '--- $@ 演示 ---'
for i in "$@"
do
    echo $i
done

执行脚本, 输出结果如下:

$ chmod a+x test.sh
$ ./test.sh 1 2 3
--- $* 演示 ---
1 2 3
--- $@ 演示 ---
1
2
3

$?

$?是一个特殊变量, 用来获取上一个命令的退出状态, 或者上一个函数的返回值.

所谓退出状态, 就是上一个命令执行后的返回结果. 退出状态是一个数字, 一般情况下, 大部分命令执行成功会返回0, 失败返回非0值, 这和C语言的main函数是类似的.