Shell 特殊变量


$0 - 脚本名
$1$9 - 脚本的参数。$1 是第一个参数,依此类推。
$* - 传递给脚本或函数的所有参数。
$@ - 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同。
$# - 参数个数
$? - 前一个命令的返回值
$$ - 当前脚本的进程识别码
!! - 完整的上一条命令,包括参数。常见应用:当你因为权限不足执行命令失败时,可以使用 sudo !! 再尝试一次。
$_ - 上一条命令的最后一个参数。如果你正在使用的是交互式shell,你可以通过按下 Esc 之后键入 . 来获取这个值。

$* 和 $@ 的区别

$*$@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n"的形式输出所有参数。
但是当它们被双引号(" ")包含时,$* 会将所有的参数作为一个整体,以 "$1 $2 … $n"的形式输出所有参数;
$@ 会将各个参数分开,以 "$1" "$2"... "$n" 的形式输出所有参数。

下面的例子可以看到 $*$@ 的区别:

#!/bin/bash
echo "\$*=" $*
echo "\"\$*\"=" "$*"

echo "\$@=" $@
echo "\"\$@\"=" "$@"

echo "print each param from \$*"
for var in $*
do
    echo "$var"
done

echo "print each param from \$@"
for var in $@
do
    echo "$var"
done

echo "print each param from \"\$*\""
for var in "$*"
do
    echo "$var"
done

echo "print each param from \"\$@\""
for var in "$@"
do
    echo "$var"
done

参考: