Shell 特殊变量和命令行参数

$0, $#, $*, $@, $?, $$

变量名只能包含数字、字母和下划线, 因为某些包含其他字符的变量有特殊含义, 这样的变量被称为特殊变量

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字, 表示第几个参数。例如, 第一个参数是$1, 第二个参数是$2
$# 传递给脚本或函数的参数个数
$* 传递给脚本或函数的所有参数
$@ 传递给脚本或函数的所有参数。被双引号(" “)包含时, 与 $* 稍有不同, 下面将会讲到
$? 上个命令的退出状态, 或函数的返回值
$$ 当前 Shell 进程 ID。对于 Shell 脚本, 就是这些脚本所在的进程 ID

例如

echo $$
29949

命令行参数

运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示, 例如, $1 表示第一个参数, $2 表示第二个参数, 依次类推。

#!/bin/bash
echo "File Name: $0"
echo "First Parameter: $1"
echo "First 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

$*$@ 的区别

在 Bash 脚本中, $*$@ 都用于表示传递给脚本或函数的所有位置参数, 但它们之间有细微的区别, 主要体现在它们处理引号 (") 的方式。

当你在循环中使用这两者时, 区别会更加明显

for arg in "$@"; do
  echo "$arg"
done

上述代码会逐个输出每个参数 (即使参数中有空格, 它们也会被当作一个整体处理)。

如果使用 $*, 则会将所有参数作为一个字符串传递给 for 循环, 可能会导致意外的行为

总结:

  • $*: 将所有参数视为一个单独的字符串
  • $@: 每个参数被独立处理, 在双引号中使用时效果最为显著

Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数

使用 Hugo 构建
主题 StackJimmy 设计