Bash 特殊变量在脚本编程中起着重要的作用,用于获取脚本自身的信息、命令的执行状态、命令行参数等。
之前我们曾介绍过 Bash 特殊变量 $?
,它表示最后一个命令或最近执行的进程的状态,也称为退出代码。
在本教程中,我们将在 Linux 说明所有 bash 特殊变量。将以实例说明每个 bash 特殊变量的使用。
bash 特殊变量
特殊变量 | 描述 |
---|---|
$0
|
获取当前脚本的名称。 |
$#
|
获取执行 bash 脚本时传递的参数数量。 |
$*
|
获取参数字符串数组。 |
$@
|
它将每个命令行参数的列表存储为数组。 |
$1-$9
|
存储前 9 个参数。 |
$?
|
获取最后一个命令或最近执行的进程的状态。 |
$!
|
显示最后一个后台命令的进程 ID。 |
$$
|
获取当前 shell 的进程 ID。 |
$-
|
获取当前 Shell 进程指定的选项。 |
$0 获取脚本的名称
要获取当前运行脚本的文件名称,您可以在脚本使用 echo 的打印 bash 特殊变量 $0
。
例如,在这里创建一个简单的 hello world 程序 Hello.sh
,脚本将会在执行时打印脚本的文件名称:
Name of shell script = hello.sh
$# 获取参数数量
如果您希望在脚本执行时获得传递给 bash 脚本的参数数量,您可以在脚本使用 bash 特殊变量 $#
。
例如,在这里创建简单的 hello world 程序 Hello.sh
,脚本将会在执行时打印脚本接受的参数数量:
为了测试这个脚本,在执行脚本时传递你可以任意个参数,它将会为我们提供传递参数的准确数量。
$* 获取参数字符串数组
如果您想获取传递给 bash 脚本的参数数组,您所要做的就是在脚本中使用 $*
。在下面的示例中,我们使用 for in 循环遍历脚本接受的所有参数:
$@ 获取脚本参数数组
你可以将此视为上述示例的高级形式,您还可以获取列中传递的参数的名称。在下面的示例中,我们使用 for in 循环遍历脚本接受的所有参数以及打印变量的总数:
#!/bin/bash
echo "No of arguments=${#@}"
echo
for arg in "$@"
do
echo "$arg "
done
$n 获取前九个参数
在此方法中,您将使用不同的变量来存储参数,因此对于某些用户来说,这是最有效的方法。
如果你非常去定参数并不会超过9个参数,使用此方法会使你的代码非常简洁。$n
语法如下所示:
#!/bin/bash
echo "Hello world"
# 最大到 $9
echo Argument 1 = $1
echo Argument 2 = $2
echo Argument 3 = $3
echo Argument 4 = $4
$? 获取最后一个命令执行状态
如果您想检查最后一个命令执行的状态,可以直接在终端中使用打印 $?
变量,通常我们将 $?
变量存储的值称为退出代码。
$?
变量 0
表示成功执行,1
表示失败,您可能还会获得除 0
或 1
其它数值,例如,指示未找到命令的错误代码 127
。更多退出代码,请参考我们的教程:Linux 命令退出代码。
您可以直接在终端中使用 echo 命令打印变量 $?
,总的来说,除了 0
以外的任何值都表明执行失败,如下所示:
echo $?
$! 获取当前在后台运行进程的 PID
使用 $!
特殊变量,您可以获得当前在后台运行进程的 PID。例如你可以使用sleep 命令创建一个后台任务,然后使用 echo 命令打印 $!
变量获取后台任务的进程 PID。
sleep 10 &
echo $!
$$ 获取当前 Shell 进程的PID
因此,如果你想知道当前 shell 进程的 PID,你需要做的就是在终端中使用 $$
变量。
echo $$
$- 获取当前 Shell 进程指定的选项
您可以设置各种选项来调整 bash 行为方式,也可以打印并变量 $-
获取当前指定的Shell 选项:
echo $-
himBHs
h
(hashall):使用此选项,bash 将会在 PATH 环境变量搜索每个命令位置。i
(interactive):这意味着您当前是交互式的 Shell。m
(monitor):此选项启用 job 控制。B
(braceexpand):启用大括号扩展。H
: (histexpand):此选项使您可以通过在感叹号并在后面指定数字来重新运行历史记录中的命令,也就是!number
。s
(source command from stdin):如果存在此选项,则从标准输入读取命令。
结论
您可以像大多数脚本语言一样在 bash 脚本使用变量。这些特殊变量使您可以更好地控制脚本。如果您有任何疑问或建议,请在评论中反馈。