Shell中的特殊变量

在本章中,我们将详细讨论Linux中的特殊变量。 在我们之前的一章中,我们了解在变量名中使用某些非字母数字字符时如何小心。 这是因为这些字符用于特殊Linux变量的名称。 这些变量是为特定功能保留的。

例如,$字符表示当前shell的进程ID或PID。

$echo $$

以上命令输出当前Shell的PID:

31688

下表显示了一些可以在Shell脚本中使用的特殊变量:

No. 命令和描述
1 $0 当前脚本的文件名。
2 $n 这里n是一个对应于参数位置的正十进制数(第一个参数是$1,第二个参数是$2,依此类推)。
3 $# 提供给脚本的参数数量。
4 $* 如果脚本接收两个参数,则$*相当于$1 $2。所有的参数都用双引号引起来。
5 $@ 如果脚本接收两个参数,则$@相当于$1 $2。所有参数都单独用双引号引起来。
6 $? 执行的最后一个命令的退出状态。
7 $$ 当前shell的进程号。 对于Shell脚本,这是它们正在执行的进程ID。
8 $! 最后一个后台命令的进程号。

命令行参数

命令行参数$1, $2, $3, ...$9是位置参数, $0指向实际的命令、程序、Shell脚本或函数, $1, $2, $3, ...$9是命令的参数。

以下脚本使用与命令行相关的各种特殊变量

#!/bin/bash

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 Jiu Tong
File Name : ./test.sh
First Parameter : Jiu
Second Parameter : Tong
Quoted Values: Jiu Tong
Quoted Values: Jiu Tong
Total Number of Parameters : 2

特殊参数$*$@

有一些特殊参数允许一次访问所有命令行参数。 $*$@的作用相同,除了它们被双引号""括起来。

这两个参数都指定了命令行参数。 但是,$*特殊参数将整个列表作为一个参数,中间有空格,$@特殊参数将整个列表作为一个参数,并将其分隔为单独的参数。

我们可以编写如下所示的Shell脚本来处理带有$*$@特殊参数的未知数量的命令行参数

#!/bin/bash

for ONE in $*
do
   echo $ONE
done

下面是以上示例的输出

$./test.sh Jiu Tong Love English
Jiu
Tong
Love
English

注意 - 这里do...done是一种循环,将在后续教程中介绍。

$./test.sh Jiu Tong
File Name : ./test.sh
First Parameter : Jiu
Second Parameter : Tong
Quoted Values: Jiu Tong
Quoted Values: Jiu Tong
Total Number of Parameters : 2
$echo $?
0