转自https://www.cnblogs.com/davidshen/p/10234178.html
shell编程中有一些特殊的变量可以使用。这些变量在脚本中可以作为全局变量来使用。
名称 | 说明 |
---|---|
$0 | 脚本名称 |
$1-9 | 脚本执行时的参数1到参数9 |
$? | 脚本的返回值 |
$# | 脚本执行时,输入的参数的个数 |
$@ | 输入的参数的具体内容(将输入的参数作为一个多个对象,即是所有参数的一个列表) |
$* | 输入的参数的具体内容(将输入的参数作为一个单词) |
$$ | Shell本身的PID(ProcessID) |
$! | Shell最后运行的后台Process的PID |
$@与$*的区别:
相同点:
$@与$* 都可以使用一个变量来来表示所有的参数内容,但这两个变量之间有一些不同之处。
不同点:
$@:将输入的参数作为一个列表对象
$*:将输入的参数作为一个单词
源代码:
1 echo "脚本的名字是:"$0
2 n=1
3 echo "使用\$@的参数列表为:"$@
4 for temstr in "$@"
5 do
6 echo "第$n个参数是:" $temstr
7 let n+=1
8 done
9
10
11 n=1
12 echo "使用\$*的参数列表为:"$*
13 for temstr in "$*"
14 do
15 echo "第$n个参数是:" $temstr
16 let n+=1
17 done
执行结果:
1 $ ./test.sh 1 2 3 4
2 脚本的名字是:./test.sh
3 使用$@的参数列表为:1 2 3 4
4 第1个参数是: 1
5 第2个参数是: 2
6 第3个参数是: 3
7 第4个参数是: 4
8 使用$*的参数列表为:1 2 3 4
9 第1个参数是: 1 2 3 4
在上面的例子中,使用 $@与$*是,都是用双引号引起来,但当$*不使用双引号时,结果与$@的结果相同。
原因分析:
当都使用双引号时,我们可以看到参数列表输出都是一样的,说明确实两个变量都可以存储所有的参数内容,也就显示出来两个变量之间的对参数处理的不同,即一个将其作为列表处理,一个讲所有参数作为一个单词处理。
当$*不适用双引号时,执行到for语句时,会首先将$*的值(1 2 3 4 )取出来,然后循环语句就变成了 for tem in 1 2 3 4 ,最后的输出结果也就变成了列表的循环输出。
1 源码:
2 #!/bin/bash
3 n=1
4 for tem in $*
5 do
6 echo $n is $tem
7 let n+=1
8 done
9
执行结果:
# ./test.sh 1 2 3 4
1 is 1
2 is 2
3 is 3
4 is 4
如果参数个数太多,达到或者超过了 10 个,那么就得用${n}的形式来接收了,例如 ${10}、${23}。{ }的作用是为了帮助解释器识别参数的边界,这跟使用变量时加{ }是一样的效果。