Linux Shell 脚本:特殊变量 0 个改进

本章我们讨论 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
$
本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!