1.shell特殊变量。

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n是一个数字,表示第几个参数。如:第一个参数是1,第二个参数是2
$# 传递给脚本或函数的参数个数
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(“”)包含时,与$*稍有不同。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前shell进程ID。对于Shell脚本,就是这些脚本所在的进程ID

2.*和@的区别

*和@都表示传递给函数或脚本的所有参数,不被双引号("")包含时,都以"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"

执行 ./test.sh "a" "b" "c" "d",看到下面的结果:

$*=  a b c d
"$*"= a b c d
$@=  a b c d
"$@"= a b c d
print each param from $*
a
b
c
d
print each param from $@
a
b
c
d
print each param from "$*"
a b c d
print each param from "$@"
a
b
c
d