乐闻世界logo
搜索文章和话题

Shell 脚本中 $0、$1、$2、$@、$*、$#、$? 等特殊变量的含义是什么?

3月6日 21:29

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 的选项标志
  • 示例:
bash
echo $- # 输出: himBH(表示启用的选项)

$_

  • 含义: 上一个命令的最后一个参数
  • 示例:
bash
ls /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

$@ 和 $* 的区别总结

特性$@$*
引用包裹每个参数独立所有参数合并
空格处理保持原样可能被合并
推荐使用

最佳实践: 在遍历参数时始终使用 "$@" 以正确处理包含空格的参数。

标签:Shell