Linux 中的 Bash 特殊变量

linuxoperating systemopen source更新于 2026/1/27 20:22:17

简介

Bash(Bourne Again Shell)是大多数 Linux 系统的默认 Shell。它是一个命令语言解释器,可以执行来自标准输入、文件或命令行参数的命令。Bash Shell 提供了一组特殊变量,其中包含各种系统相关和用户相关的信息。这些特殊变量用于高效地操作和访问数据。本文将通过示例探索 Linux 中的 Bash 特殊变量。

什么是 Bash 特殊变量?

Bash 特殊变量是预定义的变量,用于存储系统和用户相关的信息。它们以"$"符号开头,在 Bash 脚本中用于执行各种操作。一些 bash 特殊变量如下:-

  • $0 - 用于存储当前正在执行的脚本或 shell 的名称。

  • $# - 存储传递给脚本的命令行参数的数量。

  • $* - 将传递给脚本的所有命令行参数存储为单个字符串。

  • $@ - 将传递给脚本的所有命令行参数存储为单独的字符串。

  • $? - 存储最后执行命令的退出状态。

  • $! - 存储最后执行的后台进程的进程 ID。

  • $IFS - 存储内部字段分隔符,用于将字符串拆分为字段。

访问 Bash 特殊变量

使用"$"符号加变量名来访问 Bash 特殊变量。例如,要访问当前正在执行的脚本名称,我们可以使用以下命令 -

echo $0

这将输出脚本名称。

同样,要访问传递给脚本的命令行参数数量,我们可以使用以下命令 -

echo $#

这将输出命令行参数数量。

$0 变量

$0 变量存储当前正在执行的脚本或 Shell 的名称。它用于获取脚本名称以在输出中显示或检查脚本是否正在运行。请考虑以下示例 -

示例

#!/bin/bash

echo "The name of script is: $0"

输出

The name of script is: script.sh

$# 变量

$# 变量存储传递给脚本的命令行参数数量。它用于在处理参数之前检查参数数量。请参考以下示例 -

示例

#!/bin/bash

echo "参数数量为:$#"

输出

如果我们使用三个命令行参数运行脚本,我们将得到以下输出 -

参数数量为:0

$* 和 $@ 变量

$* 和 $@ 变量分别将传递给脚本的所有命令行参数存储为单个字符串和单独的字符串。$* 变量使用 IFS 变量的第一个字符分隔参数,而 $@ 变量使用空格分隔参数。请参考以下示例 -

示例

#!/bin/bash

echo "使用 \$* 的参数为:$*"
echo "使用 \$@ 的参数为:$@"

输出

如果我们使用三个命令行参数运行脚本,将得到以下输出 -

使用 $* 的参数为:
使用 $@ 的参数为:

$? 变量

$? 变量存储最后执行命令的退出状态。它用于检查最后命令是否执行成功。命令的退出状态是一个介于 0 到 255 之间的整数值,其中 0 表示成功,任何非零值表示错误。请考虑以下示例 -

示例

#!/bin/bash

ls
echo "最后命令的退出状态为:$?"

输出

main.sh
最后命令的退出状态为:0

在此示例中,ls 命令列出了当前目录中的文件,echo 命令显示了最后一个命令的退出状态。由于 ls 命令执行成功,因此退出状态为 0。

$$

$$ 变量存储当前正在运行的脚本或 Shell 的进程 ID (PID)。它用于标识正在运行脚本的进程。请考虑以下示例 -

示例

#!/bin/bash

echo "当前脚本的进程 ID 为:$$"

输出

当前脚本的进程 ID 为:1929919

在此示例中,echo 命令显示当前脚本的 PID。

$! 变量

$! 变量存储最后一个执行的后台进程的进程 ID (PID)。它用于检查后台进程的状态或在需要时终止它。请参考以下示例 -

示例

#!/bin/bash

sleep 10 &
echo "最后一个后台进程的进程 ID 为:$!"

输出

最后一个后台进程的进程 ID 为:12346

本例中,sleep 命令在后台执行,echo 命令显示后台进程的 PID。

$IFS 变量

$IFS 变量存储内部字段分隔符,用于将字符串拆分为字段。它用于指定用于分隔字符串中字段的字符。默认情况下,IFS 变量设置为空格、制表符和换行符。请考虑以下示例 -

示例

#!/bin/bash

IFS=:
echo "Field 1:Field 2:Field 3" | while read f1 f2 f3
do
   echo "Field 1: $f1"
   echo "Field 2: $f2"
   echo "Field 3: $f3"
done

输出

Field 1: Field 1
Field 2: Field 2
Field 3: Field 3

在此示例中,IFS 变量设置为":"(冒号),echo 命令输出一个包含三个字段的字符串,这些字段由冒号分隔。while 循环读取字符串并使用 IFS 变量将其拆分为字段,echo 命令则显示各个字段。

$LINENO 变量

$LINENO 变量用于显示 Bash 脚本中的当前行号。它在调试脚本时特别有用,因为您需要知道哪一行代码导致了特定的错误。请考虑以下示例 -

示例

#!/bin/bash

echo "Line number: $LINENO"
echo "Line number: $LINENO"

输出

Line number: 3
Line number: 4

在此示例中,echo 命令显示 $LINENO 变量的值,该变量在执行时自动设置为脚本的行号。

$BASH_SOURCE 和 $FUNCNAME 变量

$BASH_SOURCE 和 $FUNCNAME 变量在函数中用于显示当前正在执行的脚本或函数的名称。$BASH_SOURCE 变量显示已执行的脚本或函数的名称,而 $FUNCNAME 变量显示当前函数的名称。请考虑以下示例 -

示例

#!/bin/bash

function func1 {
   echo "Function name: ${FUNCNAME[0]}"
   echo "Script name: ${BASH_SOURCE[0]}"
}

function func2 {
   func1
}
func2

输出

Function name: func1
Script name: /path/to/script.sh

在此示例中,我们定义了两个函数,func1 和 func2,并调用 func2。在 func2 内部,我们调用 func1,它会显示 $FUNCNAME 和 $BASH_SOURCE 的值。由于 func1 是当前函数,因此其名称显示为 $FUNCNAME 的值,脚本名称显示为 $BASH_SOURCE 的值。

$SECONDS 变量

$SECONDS 变量用于显示自脚本开始运行以来已过去的秒数。它在测量脚本或脚本特定部分的执行时间时特别有用。请考虑以下示例 -

示例

#!/bin/bash

echo "Script started at $(date)"
sleep 5
echo "Elapsed time: $SECONDS seconds"

输出

Script started at Wed Mar 15 14:26:58 IST 2023
Elapsed time: 5 seconds

在本例中,我们使用 $SECONDS 变量显示脚本自开始运行以来已过去的秒数。sleep 命令用于暂停脚本执行 5 秒,执行 sleep 命令后将显示已运行的时间。

结论

Bash 特殊变量是 Linux 中 Bash 脚本的重要组成部分。它们提供了一种简单高效的方式来访问和操作与系统和用户相关的信息。在本文中,我们探讨了一些常用的 Bash 特殊变量,例如 $0、$#、$*、$@、$?、$$、$! 和 $IFS,并提供了它们的使用示例。通过在脚本中使用这些变量,我们可以增强 Bash 脚本的功能性和可用性。


相关文章


有用资源