以下参考卡提供了某些脚本概念的有用概要。 前文更深入地探讨了这些问题,并给出了用法示例。
表 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 | 文件是字符设备 | -g | sgid 标志已设置 | |
-p | 文件是管道 | -u | suid 标志已设置 | |
-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} | 扩展大括号展开 |
{} | 文本替换,在 find 和 xargs 之后 |
圆括号 | |
( 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` | 命令替换,经典样式 |