Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

在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 未设置或为空,设置 vardefault 示例:${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: $!"

评论