Shell 脚本中 $0、$1、$2、$@、$*、$#、$? 等特殊变量的含义如下:
位置参数变量
$0
- 含义: 当前脚本的文件名
- 用途: 获取脚本自身的名称或路径
- 示例:
bash#!/bin/bash echo "Script name: $0" # 输出: Script name: ./script.sh
$1, $2, $3, ..., ${10}, ${11}, ...
- 含义: 传递给脚本的参数
- $1: 第一个参数
- $2: 第二个参数
- ${10}: 第十个参数(需要花括号)
- 示例:
bash#!/bin/bash echo "First argument: $1" echo "Second argument: $2" echo "Tenth argument: ${10}" # 执行: ./script.sh arg1 arg2 # 输出: First argument: arg1 # Second argument: arg2
特殊参数变量
$#
- 含义: 传递给脚本的参数个数
- 用途: 检查参数数量或遍历所有参数
- 示例:
bash#!/bin/bash echo "Number of arguments: $#" # 执行: ./script.sh arg1 arg2 arg3 # 输出: Number of arguments: 3
$@
- 含义: 所有位置参数,作为独立的字符串
- 特点: 每个参数都保持独立,用引号包裹时不会合并
- 示例:
bash#!/bin/bash for arg in "$@"; do echo "Argument: $arg" done # 执行: ./script.sh "hello world" "foo bar" # 输出: Argument: hello world # Argument: foo bar
$*
- 含义: 所有位置参数,作为一个单一的字符串
- 特点: 所有参数合并成一个字符串,用 IFS 的第一个字符分隔
- 示例:
bash#!/bin/bash echo "All arguments: $*" # 执行: ./script.sh arg1 arg2 arg3 # 输出: All arguments: arg1 arg2 arg3
$?
- 含义: 上一个命令的退出状态码
- 用途: 检查命令是否成功执行
- 返回值: 0 表示成功,非 0 表示失败
- 示例:
bash#!/bin/bash ls /nonexistent echo "Exit status: $?" # 输出: ls: /nonexistent: No such file or directory # Exit status: 1
$$
- 含义: 当前 Shell 进程的 PID(进程 ID)
- 用途: 创建唯一的临时文件名或进程管理
- 示例:
bash#!/bin/bash echo "Current PID: $$" # 输出: Current PID: 12345
$!
- 含义: 最近一个后台进程的 PID
- 用途: 跟踪后台进程
- 示例:
bash#!/bin/bash sleep 10 & echo "Background PID: $!"
其他特殊变量
$-
- 含义: 当前 Shell 的选项标志
- 示例:
bashecho $- # 输出: himBH(表示启用的选项)
$_
- 含义: 上一个命令的最后一个参数
- 示例:
bashls /etc/passwd echo $_ # 输出: /etc/passwd
实际应用示例
bash#!/bin/bash # 检查参数数量 if [ $# -lt 2 ]; then echo "Usage: $0 <arg1> <arg2>" exit 1 fi echo "Script: $0" echo "Total arguments: $#" echo "All arguments (\$@):" for arg in "$@"; do echo " - $arg" done echo "All arguments (\$*): $*" echo "First arg: $1" echo "Second arg: $2" # 执行命令并检查状态 ls "$1" if [ $? -eq 0 ]; then echo "Command succeeded" else echo "Command failed" fi
$@ 和 $* 的区别总结
| 特性 | $@ | $* |
|---|---|---|
| 引用包裹 | 每个参数独立 | 所有参数合并 |
| 空格处理 | 保持原样 | 可能被合并 |
| 推荐使用 | 是 | 否 |
最佳实践: 在遍历参数时始终使用 "$@" 以正确处理包含空格的参数。