Unix / Linux - 特殊变量

  • 简述

    本章将详细讨论 Unix 中的特殊变量。在我们之前的一章中,我们了解在变量名中使用某些非字母数字字符时如何小心。这是因为这些字符用于特殊 Unix 变量的名称。这些变量是为特定功能保留的。
    例如, $ 字符表示当前 shell 的进程 ID 号或 PID -
    
    $echo $
    
    
    
    
    上面的命令写入当前 shell 的 PID -
    
    29949
    
    下表显示了一些可以在 shell 脚本中使用的特殊变量 -
    序号 变量和描述
    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/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
    
  • 特殊参数 $* 和 $@

    有一些特殊参数允许一次访问所有命令行参数。 $*$@ 除非用双引号括起来,否则两者的作用相同, "".
    这两个参数都指定了命令行参数。但是,“$*”特殊参数将整个列表作为一个参数,中间有空格,“$@”特殊参数将整个列表作为一个参数,并将其分隔为单独的参数。
    我们可以编写如下所示的 shell 脚本,以使用 $* 或 $@ 特殊参数处理未知数量的命令行参数 -
    
    #!/bin/sh
    for TOKEN in $*
    do
       echo $TOKEN
    done
    
    这是上述脚本的示例运行 -
    
    $./test.sh Zara Ali 10 Years Old
    Zara
    Ali
    10
    Years
    Old
    
    Note - 这里 do...done 是一种循环,将在后续教程中介绍。
  • 退出状态

    $? 变量表示上一个命令的退出状态。
    退出状态是每个命令在完成时返回的数值。通常,大多数命令在成功时返回 0 退出状态,如果不成功则返回 1。
    由于特定原因,某些命令会返回额外的退出状态。例如,某些命令会区分错误类型,并会根据特定的故障类型返回各种退出值。
    以下是成功命令的示例 -
    
    $./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
    $