Linux中的Bash特殊变量


简介

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 "The number of arguments is: $#"

输出

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

The number of arguments is: 0

$* 和 $@ 变量

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

示例

#!/bin/bash

echo "The arguments using \$* are: $*"
echo "The arguments using \$@ are: $@"

输出

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

The arguments using $* are: 
The arguments using $@ are: 

$? 变量

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

示例

#!/bin/bash

ls
echo "The exit status of last command is: $?"

输出

main.sh
The exit status of last command is: 0

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

$$

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

示例

#!/bin/bash

echo "The process ID of current script is: $$"

输出

The process ID of current script is: 1929919

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

$! 变量

$! 变量存储最后执行的后台进程的进程 ID (PID)。它用于检查后台进程的状态或根据需要终止它。考虑以下示例:

示例

#!/bin/bash

sleep 10 &
echo "The process ID of last background process is: $!"

输出

The process ID of last background process is: 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 脚本的功能和可用性。

更新于:2023年7月14日

227 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.