>[success] # shell -- 位置参数变量 | 位置参数变量 | 作用 | | --- | --- | | $n | n为数字,$0代表命令本身,$1-$9代表第1到第9个参数,10以上的参数需要用大括号包含,如${10} | | $\* | 这个变量代表命令中所有的参数,$\*把所有的变看数看成一个整体 | | $@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数进行区分 | | $# | 这个变量代表命令行中所有参数的个数 | | $? | 最后一次执行的命令的返回状态。0表示正确执行,非0表示不正确执行 | | $$ | 当前进程的进程号(PID) | >[danger] ##### 案例 编写下面的代码,并保存为 test.sh: ~~~ #!/bin/bash echo "Process ID: $$" echo "File Name: $0" echo "First Parameter : $1" echo "Second Parameter : $2" echo "All parameters 1: $@" echo "All parameters 2: $*" echo "Total: $#" ~~~ 运行 test.sh,并附带参数: ~~~ [mozhiyan@localhost demo]$ . ./test.sh Shell linux Process ID: 5943 File Name: bash First Parameter : Shell Second Parameter : Linux All parameters 1: Shell Linux All parameters 2: Shell Linux Total: 2 ~~~ >[danger] ##### Shell $\*和$@之间的区别 [案例来自文章 Shell $\*和$@之间的区别 ](http://www.beylze.cn/shell/707.html) ~~~ $\* 和 $@ 都表示传递给函数或脚本的所有参数,我们已在《[shell](http://www.beylze.cn/shell/)特殊变量》一节中进行了演示,本节重点说一下它们之间的区别。 当 $\* 和 $@ 不被双引号`" "`包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。 但是当它们被双引号`" "`包含时,就会有区别了: * `"$*"`会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。 * `"$@"`仍然将每个参数都看作一份数据,彼此之间是独立的。 比如传递了 5 个参数,那么对于`"$*"`来说,这 5 个参数会合并到一起形成一份数据,它们之间是无法分割的;而对于`"$@"`来说,这 5 个参数是相互独立的,它们是 5 份数据。 如果使用 echo 直接输出`"$*"`和`"$@"`做对比,是看不出区别的;但如果使用 for 循环来逐个输出数据,立即就能看出区别来。 ~~~ * 关于 for 循环的用法请猛击:Shell for循环和for int循环详解 编写下面的代码,并保存为 test.sh: ~~~ #!/bin/bash echo "print each param from \"\$*\"" for var in "$*" do     echo "$var" done echo "print each param from \"\$@\"" for var in "$@" do     echo "$var" done ~~~ 运行 test.sh,并附带参数: ~~~ \[mozhiyan@localhost demo\]$ . ./test.sh a b c d print each param from "$\*" a b c d print each param from "$@" a b c d ~~~ 从运行结果可以发现,对于`"$*"`,只循环了 1 次,因为它只有 1 分数据;对于`"$@"`,循环了 5 次,因为它有 5 份数据。