Linux Shell 脚本:特殊变量
本章我们讨论 Unix 系统中一些特殊变量。之前的章节中我们讲过变量名中不能包含一些非字母的特殊字符。这是因为这些字符在 Unix 中有特殊含义,一些是 Unix 系统特定的变量名。这些变量被系统保留用于特定用途。
举例,$ 字符就是系统内置特有变量,代表进程 ID 的含义,即 PID。如下命令显示当前外壳程序的进程 ID :
$echo $$
以上命令显示当前外壳程序的进程 ID:
29949
下面的表格列出可以在外壳脚本中使用的一些特殊变量:
变量名 | 描述 |
---|---|
$0 | 当前运行脚本的文件名。 |
$n | 这些变量代表执行脚本命令行上的命令参数。这里 n 是具体数字,表示参数位置(第一个参数是 $1,第二个参数 $2 ...) |
$# | 表示执行脚本命令行参数的数量。 |
$* | 表示执行脚本命令行上所有的命令参数集合,用双引号整体括住的形式。举例,若有命令行上有2个参数,$* 相当于 "$1 $2" |
$@ | 表示执行脚本命令行上所有的命令参数集合,用双引号每个参数单独括住的形式。举例,若有命令行上有2个参数,$@ 相当于 "$1" "$2" |
$? | 最后执行完成命令的退出状态码。 |
$$ | 当前外壳进程 ID 。对于脚本,指运行脚本环境的外壳进程 ID 。 |
$! | 通过命令行执行的后台命令程序中最后一个的进程 ID 。 |
命令行命令参数
命令参数 $1, $2, $3, ...$9 其中的数字指示命令参数位置,且 $0 指示实际命令、程序、脚本或调用函数本身,$1, $2, $3, ...$9 是传入的参数。
下面的脚本显示运行脚本时传入的命令行命令参数:
#!/bin/sh
echo "File Name: $0"
echo "First Parameter : $1"
echo "Second Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"
下面是命令行中执行这个脚本时的输出:
$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2
特殊参数变量 $* 和 $@
有两个特殊参数变量一次性访问所有命令行的命令参数。 $* 和 $@ 相同,都表示所有的命令参数,仅仅的差别是双引号( "")括住的方式。
这两个特殊命令参数都表示命令行中所有的命令参数。"$*" 表示所有命令参数以空格分隔形成整体被双引号括住的一个字符串。而 "$@" 表示成每个参数分别被双引号括住的字符串集合。
我们可写出如下脚本,通过 $* 和 $@ 遍历命令行未知有多少个命令参数的每个命令参数:
#!/bin/sh
for TOKEN in $*
do
echo $TOKEN
done
下面是上述脚本运行的命令行输出:
$./test.sh Zara Ali 10 Years Old
Zara
Ali
10
Years
Old
注意: 「do...done」是后续指南中将讲解的外壳程序语言的循环控制结构。
命令行命令执行退出状态码
特殊变量 $? 代表之前最后运行结束的命令行退出状态码。
命令行退出状态码是一个数值,它表示每个运行结束最后完成命令的完成状态。一个基本规则是,若执行成功,返回数值 0 ,若执行不成功,返回数值 1 (或非 0 )。
一些命令会由于各种执行失败的特殊原因,返回不同的退出状态数值。举例来说,一些命令由于执行过程中不同的条件或状态造成执行失败,它们会根据不同的错误原因返回不同的状态码。
下面是执行成功的命令输出:
$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2
$echo $?
0
$