1 Shell 编程中的参数引用

引用参数 描述
0, 1, 2… 传递给脚本的参数位置,可以理解为传递进去的参数是个数组,通过数组下标取得参数
* 显示所有向脚本传递的参数
@ 显示所有向脚本传递的参数
# 参数数量(不包含参数 0)
$ 脚本运行的当前进程 ID 号
! 后台运行的最后一个进程的 ID 号
? 上一条命令的执行结果,0 为成功,其他都为失败
- 显示 shell 当前可以使用的功能,显示的每一个字母都是一项配置

以下是案例:

1.1 0, 1, 2… 例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 看一下脚本
$> cat para.sh
#!/bin/bash
echo '$0 = '$0
echo '$1 = '$1
echo '$2 = '$2
echo '$3 = '$3
$> ./para.sh 1 2 3
$0 = ./para.sh
$1 = 1
$2 = 2
$3 = 3
# 可以理解为下面这个式子
# 所以 bash 的第一个参数就是 ./para.sh
# 第二个参数就是 1
# 传入的参数是一个数组,下标从 0 开始
$> /bin/bash ./para.sh 1 2 3
$0 = ./para.sh
$1 = 1
$2 = 2
$3 = 3

0, 1, 2… 只能表达到 9,如果你拥的参数多于 9 个,则不能使用 $10 来引用第十个参数。首先必须处理或保存第一个参数 $1,然后使用 shift 命令删除参数 1,并将所有剩余的参数下移一位,因此 $10 就变成了 $9,以此类推。$# 的值将被更新,以反映参数的剩余数量。在实践中,最常见的情况是将参数迭代到函数或 shell 脚本或者迭代到命令,替换使用 for 语句创建的列表,因此这个约束基本不成问题。

下面是遍历参数的例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
$> cat ./para.sh
#!/bin/bash
echo "参数的剩余个数: $#"
for var in $@
do 
    echo "参数的值:$var"
    echo "执行 shift"
    shift
    echo "参数的剩余个数: $#"
done
$> ./para.sh 1 2 3
参数的剩余个数: 3
参数的值:1
执行 shift
参数的剩余个数: 2
参数的值:2
执行 shift
参数的剩余个数: 1
参数的值:3
执行 shift
参数的剩余个数: 0

1.2 $* 和 $@ 的区别

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$> cat para.sh
#!/bin/bash
echo "直接输出:"
echo '$* = '$*
echo '$@ = '$@
echo ""
echo "不使用双引号直接遍历:"
echo '$*: '
for var in $*
do
    echo $var
done
echo '$@: '
for var in $@
do 
    echo $var
done
echo ""
echo "使用双引号再遍历:"
echo '$*: '
for var in "$*"
do
    echo $var
done
echo '$@: '
for var in "$@"
do 
    echo $var
done
$> ./para.sh 1 2 3
直接输出:
$* = 1 2 3
$@ = 1 2 3

不使用双引号直接遍历:
$*:
1
2
3
$@:
1
2
3

使用双引号再遍历:
$*:
1 2 3
$@:
1
2
3