在Bash shell中,特殊符号和变量用于执行各种任务,例如引用参数、进程控制、退出状态等。以下是常见的特殊符号和变量及其含义和用法:
1. 进程相关的变量
| 符号 |
含义 |
功能与用法 |
$$ |
当前shell的进程ID (PID) |
用于获取当前脚本或shell的进程号。示例:echo "当前PID: $$" |
$! |
最后一个后台运行的进程的PID |
用于获取最近在后台执行的命令的进程号。示例:sleep 10 & 后 echo $! |
$? |
上一个命令的退出状态码 |
0表示成功,非0表示失败。示例:ls; echo $? |
$- |
当前shell的选项标志 |
显示当前shell的设置选项(如 himBH)。示例:echo $- |
$BASHPID |
当前Bash进程的PID(与 $$ 类似,但更准确于子shell) |
在子shell中 $BASHPID 与 $$ 可能不同。 |
2. 位置参数
| 符号 |
含义 |
功能与用法 |
$0 |
当前脚本或shell的名称 |
如果是脚本,则是脚本文件名;如果是交互式shell,通常是 bash。 |
$1, $2, … |
脚本或函数的第1、2… 个参数 |
引用传递给脚本或函数的参数。示例:echo "第一个参数: $1" |
$# |
传递给脚本或函数的参数个数 |
示例:echo "参数个数: $#" |
$@ |
所有位置参数列表(每个参数独立) |
相当于 "$1" "$2" …,用于循环或传递参数保持原样。 |
$* |
所有位置参数合并为一个字符串 |
相当于 "$1 $2 …"(受IFS影响),通常不如 $@ 常用。 |
$@ 与 $* 的区别:
在双引号内 "$@" 会展开为多个独立参数,"$*" 会展开为单个字符串。
3. 特殊参数
| 符号 |
含义 |
功能与用法 |
$_ |
上一个命令的最后一个参数 |
示例:ls /tmp; echo $_ 会输出 /tmp |
$ |
当前shell的PID(同 $$) |
常见于如 ps -p $$ 这样的命令。 |
4. 数组相关
| 符号 |
含义 |
功能与用法 |
${array[@]} |
数组的所有元素(类似 $@) |
示例:arr=(a b c); echo "${arr[@]}" |
${array[*]} |
数组的所有元素合并为一个字符串(类似 $*) |
示例:echo "${arr[*]}" |
${#array[@]} |
数组元素的个数 |
示例:echo "数组长度: ${#arr[@]}" |
5. 扩展与替换
| 符号 |
含义 |
功能与用法 |
${var:-default} |
如果 var 未设置或为空,使用 default |
示例:echo ${name:-"匿名"} |
${var:=default} |
如果 var 未设置或为空,设置 var 为 default |
示例:${count:=0} |
${var:?error} |
如果 var 未设置或为空,打印错误并退出 |
用于参数检查。 |
${var:+repl} |
如果 var 已设置且非空,使用 repl,否则为空 |
用于条件替换。 |
${#var} |
字符串 var 的长度 |
示例:name="abc"; echo ${#name} |
${var%pattern} |
从 var 末尾删除最短匹配 pattern |
示例:file="a.txt"; echo ${file%.*} → a |
${var%%pattern} |
从 var 末尾删除最长匹配 pattern |
示例:file="a.tar.gz"; echo ${file%%.*} → a |
${var#pattern} |
从 var 开头删除最短匹配 pattern |
示例:file="/usr/bin/ls"; echo ${file#*/} → usr/bin/ls |
${var##pattern} |
从 var 开头删除最长匹配 pattern |
示例:echo ${file##*/} → ls |
6. 进程替换与命令替换
| 符号 |
含义 |
功能与用法 |
$(command) |
命令替换(推荐) |
将命令输出作为字符串。示例:files=$(ls) |
`command` |
命令替换(旧式,已不推荐) |
同 $(command),但嵌套时易错。 |
<(command) |
进程替换(输入) |
将命令输出作为临时文件传递。示例:diff <(ls dir1) <(ls dir2) |
>(command) |
进程替换(输出) |
将输出传递给命令。示例:echo "test" > >(cat) |
7. 引号相关
| 符号 |
含义 |
功能与用法 |
" " |
弱引用(允许变量扩展) |
示例:echo "$HOME" |
' ' |
强引用(禁止所有扩展) |
示例:echo '$HOME' |
` |
命令替换(已过时) |
同上文。 |
$' ' |
ANSI - C引用(支持转义字符) |
示例:echo $'line1\nline2' |
$" " |
本地化字符串(用于翻译) |
一般与 gettext 一起使用。 |
8. 其他常用符号
| 符号 |
含义 |
功能与用法 |
$PPID |
父进程的PID |
示例:echo "父进程PID: $PPID" |
$UID |
当前用户的用户ID |
示例:[ $UID -eq 0 ] && echo "root" |
$RANDOM |
随机整数(0 - 32767) |
示例:echo $RANDOM |
$SECONDS |
脚本已运行的秒数 |
示例:echo "运行了 $SECONDS 秒" |
$LINENO |
当前行号(用于调试) |
示例:echo "错误在行: $LINENO" |
$FUNCNAME |
当前函数名(数组) |
示例:echo "当前函数: ${FUNCNAME[0]}" |
$BASH_SOURCE |
脚本源文件名(数组) |
用于获取脚本路径。 |
$BASH_VERSION |
Bash版本字符串 |
示例:echo "Bash版本: $BASH_VERSION" |
9. 示例脚本
1 2 3 4 5 6 7 8 9 10
| #!/bin/bash echo "脚本名: $0" echo "第一个参数: $1" echo "所有参数: $@" echo "参数个数: $#" echo "当前PID: $$" echo "上一个命令状态: $?" echo "上一个命令最后一个参数: $_" sleep 2 & echo "后台进程PID: $!"
|