在看apisix-dashborad的项目时,发现入口的脚本我都没懂啥意思,赶紧查一下shell中各个参数的含义。

含义

  • $0 当前进程的名字
  • $n 当前进程的第n个参数值,n的取值范围为1~9
  • $* 当前进程的所有参数,可以超过9个
  • $# 当前进程的参数个数
  • $$ 当前进程的PID
  • $! 后台运行的上一个进程的pid,比如直接打开一个终端,它的前一个进程pid是0
  • $? 执行的上一条指令的返回值(显示上一条命令的退出状态。0表示没有错误,其他返回值对应的错误在Linux中可以用errno对比)
  • $- 显示shell使用的当前选项,与set命令功能相同
  • $@ 跟$*类似,但是可以当做数组使用

$* 和 $@的区别

在没有使用双引号的情况下,这两种使用方式是一致的,每一个参数都是独立的个体;而在使用双引号的情况下则不同,$*会把所有的参数视为一个整体,输出是也是一个整体,而$@依然是将每一个参数视为独立的个体。执行下面的两个脚本,就可以看出不同。

不带引号:

1
2
3
4
5
6
7
8
9
10
!/bin/bash
echo "-- \$* 演示 --"
for i in $*; do
echo $i
done

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

输出:

1
2
3
4
5
6
7
8
9
▶ ./test.sh 1 2 3
-- $* 演示 --
1
2
3
-- $@ 演示 --
1
2
3

带引号:

1
2
3
4
5
6
7
8
9
10
!/bin/bash
echo "-- \$* 演示 --"
for i in "$*"; do
echo $i
done

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

输出:

1
2
3
4
5
6
7
▶ ./test.sh 1 2 3
-- $* 演示 --
1 2 3
-- $@ 演示 --
1
2
3