附录 B. 参考卡

以下参考卡提供了某些脚本概念的有用概要。 前文更深入地探讨了这些问题,并给出了用法示例。

表 B-1. 特殊 Shell 变量

变量含义
$0脚本文件名
$1位置参数 #1
$2 - $9位置参数 #2 - #9
${10}位置参数 #10
$#位置参数的数量
"$*"所有位置参数(作为一个单词)*
"$@"所有位置参数(作为单独的字符串)
${#*}位置参数的数量
${#@}位置参数的数量
$?返回值
$$脚本的进程 ID (PID)
$-传递给脚本的标志 (使用 set)
$_上一个命令的最后一个参数
$!在后台运行的最后一个作业的进程 ID (PID)

* 必须用引号引起来,否则默认为$@.

表 B-2. TEST 运算符:二元比较

运算符含义-----运算符含义
     
算术比较  字符串比较 
-eq等于 =等于
   ==等于
-ne不等于 !=不等于
-lt小于 \<小于 (ASCII) *
-le小于或等于   
-gt大于 \>大于 (ASCII) *
-ge大于或等于   
   -z字符串为空
   -n字符串不为空
     
算术比较在双括号内 (( ... ))   
>大于   
>=大于或等于   
<小于   
<=小于或等于   

* 如果在双中括号 [[ ... ]] 测试结构中,则无需转义 \

表 B-3. TEST 运算符:文件

运算符测试是否-----运算符测试是否
-e文件存在 -s文件大小不为零
-f文件是普通文件   
-d文件是目录 -r文件具有读取权限
-h文件是符号链接 -w文件具有写入权限
-L文件是符号链接 -x文件具有执行权限
-b文件是块设备   
-c文件是字符设备 -gsgid 标志已设置
-p文件是管道 -usuid 标志已设置
-S文件是套接字 -k"sticky bit" 标志已设置
-t文件与终端关联   
     
-N文件自上次读取后已修改 F1 -nt F2文件 F1 比 F2 *
-O您拥有该文件 F1 -ot F2文件 F1 比 F2 *
-G文件的组 ID 与您的相同 F1 -ef F2文件 F1 和 F2 是同一文件的硬链接 *
     
!NOT (反转上述测试的意义)   

* 二元运算符(需要两个操作数)。

表 B-4. 参数替换和展开

表达式含义
${var}的值var(与$var)
  
${var-$DEFAULT}如果var未设置,则将表达式 求值$DEFAULT *
${var:-$DEFAULT}如果var未设置或为空,则将表达式求值$DEFAULT *
  
${var=$DEFAULT}如果var未设置,则将表达式求值 为$DEFAULT *
${var:=$DEFAULT}如果var未设置或为空,则将表达式求值 为$DEFAULT *
  
${var+$OTHER}如果var已设置,则将表达式求值 为$OTHER,否则为 null 字符串
${var:+$OTHER}如果var已设置,则将表达式求值 为$OTHER,否则为 null 字符串
  
${var?$ERR_MSG}如果var未设置,打印$ERR_MSG并中止脚本,退出状态为 1。*
${var:?$ERR_MSG}如果var未设置,打印$ERR_MSG并中止脚本,退出状态为 1。*
  
${!varprefix*}匹配所有先前声明的以varprefix
${!varprefix@}匹配所有先前声明的以varprefix

* 如果var 设置,则将表达式求值 为$var,没有副作用。

# 注意 运算符的某些上述行为已从 Bash 的早期版本更改。

表 B-5. 字符串操作

表达式含义
${#string}的长度$string
  
${string:position}$string位置$position
${string:position:length}提取$length个字符的子字符串,从$string位置$position[零索引,第一个字符位于位置 0]
  
${string#substring}$substring的前面剥离最短匹配项$string
${string##substring}剥离最长匹配项$substring的前面剥离最短匹配项$string
${string%substring}$substring$string
${string%%substring}剥离最长匹配项$substring$string
  
${string/substring/replacement}替换第一个匹配项$substring$replacement
${string//substring/replacement}替换所有匹配项$substring$replacement
${string/#substring/replacement}如果$substring匹配$string的前,替换$replacement$substring
${string/%substring/replacement}如果$substring匹配$string的前,替换$replacement$substring
  
  
后端expr match "$string" '$substring'$substring匹配$string
* 开头的长度expr match "$string" '$substring'$substring匹配$string
expr "$string" : '$substring'expr index "$string" $substring$string$substring* 中第一个字符的数字位置,该字符匹配 [如果未找到匹配项则为 0,第一个字符计数为位置 1]
expr substr $string $position $length提取$length个字符,从$string位置$position[如果未找到匹配项则为 0,第一个字符计数为位置 1]
expr match "$string" '\($substring\)'提取$substring* ,从$string
expr "$string" : '\($substring\)'提取$substring* 开始搜索$string
expr match "$string" '.*\($substring\)'提取$substring* ,从$string
expr "$string" : '.*\($substring\)'提取$substring* ,从$string

* 其中$substring正则表达式

表 B-6. 其他构造

表达式解释
  
方括号 
if [ CONDITION ]测试构造
if [[ CONDITION ]]扩展测试构造
Array[1]=element1数组初始化
[a-z]字符范围,在正则表达式
  
花括号 
${variable}参数替换
${!variable}间接变量引用
{ command1; command2; . . . commandN; }代码块
{string1,string2,string3,...}大括号展开
{a..z}扩展大括号展开
{}文本替换,在 findxargs 之后
  
  
圆括号 
( command1; command2 )子 shell 中执行的命令组
Array=(element1 element2 element3)数组初始化
result=$(COMMAND)命令替换,新样式
>(COMMAND)进程替换
<(COMMAND)进程替换
  
双圆括号 
(( var = 78 ))整数算术
var=$(( 20 + 5 ))整数算术,带变量赋值
(( var++ ))C 风格 变量递增
(( var-- ))C 风格 变量递减
(( var0 = var1<98?9:21 ))C 风格 三元运算
  
引号 
"$variable"“弱”引用
'string'“强”引用
  
反引号 
result=`COMMAND`命令替换,经典样式