bash script
bash 脚本是 linux 的必备基础,构建工具 make 规则的命令是单行的 bash 脚本,提交给 subshell 执行,在此针对 bash 的基础做个备忘。
变量
变量配置方式 | 说明 |
---|---|
${变量#关键词} | 若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除 |
${变量##关键词} | 若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除 |
${变量%关键词} | 若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除 |
${变量%%关键词} | 若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除 |
${变量/旧字符串/新字符串} | 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』 |
${变量//旧字符串/新字符串} | 若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』 |
变量配置方式 | str 没有配置 | str 为空字符串 | str 已配置非为空字符串 |
---|---|---|---|
var=${str-expr} | var=expr | var= | var=$str |
var=${str:-expr} | var=expr | var=expr | var=$str |
var=${str+expr} | var= | var=expr | var=expr |
var=${str:+expr} | var= | var= | var=expr |
var=${str=expr} | str=expr, var=expr | str 不变, var= | str 不变, var=$str |
var=${str:=expr} | str=expr, var=expr | str=expr, var=expr | str 不变, var=$str |
var=${str?expr} | expr 输出至 stderr | var= | var=$str |
var=${str:?expr} | expr 输出至 stderr | expr 输出至 stderr | var=$str |
${#str}
返回字符串长度,等价于 strlen(str)
。
条件语句
利用 test
或者 [ expression ]
或者 [[ expression ]]
进行条件测试。详见 test 手册。
[ -e FILE ]
文件类型判断[ -r FILE ]
文件权限判断[ FILE1 -nt FILE2 ]
文件比较[ INT1 -lt INT2 ]
整数比较[ STR1 == STR2 ]
字符串比较test -e FILE -a test -r FILE
or[ test -e FILE ] && [ test -r FILE ]
多重比较
控制语句
- if 语句
if <condition>; then
<...>
elif <condition>; then
<...>
else
<...>
fi
if <condition>
then
<...>
elif <condition>
then
<...>
else
<...>
fi
一般使用短路求值代替 if
语句,如:
fp='/usr/local/bin/gdb'
if [ -f ${fp} ]; then
echo 'exists.'
else
echo 'no exists.'
fi
等价
fp='/usr/local/bin/gdb'
[ -f ${fp} ] && echo 'exists.' || echo 'no exists.'
- case 语句
case ${var} in
<case1>)
<...>
;;
<case2>)
<...>
;;
*)
<...>
;;
esac
- for 语句
for var in <list>
do
<...>
done
for (( i=1; i<10; ++i ))
do
<...>
done
- while 语句
while <condition>
do
<...>
done
- until 语句
until <condition>
do
<...>
done
函数
自定义函数只能返回整型,来表示成功与否,若要返回值可通过操作全局变更达成。这点与 make
自定义函数类似。
function <fname>() {
<...>
return <integer>
}
自动变量:
$#
参数个数,不包括函数名或程序名($0
)。$@
代表『 “$1” “$2” “$3” “$4” 』之意,每个变量是独立的(用双引号括起来)。$*
代表『 “$1c$2c$3c$4” 』,其中 c 为分隔字节,默认为空白键, 所以本例中代表『 “$1 $2 $3 $4” 』之意。$n
代表特定索引的输入参数。
其它
#!/bin/bash
程序的第一行魔术行,表达使用特定的解释器运行。source xx.sh
or. xx.sh
直接在当前解释器中运行,而不是在 subshell 中运行。- 单引号括住的变量不展开求值,而双引号括住的变量进行展开求值。
- 在双引号括住的字符串中包含脱字符包围的命令当在变量的求值过程中调用。
(( expression ))
双括号括住的为整型运算,参与运算的操作数变量不必加$
。
(阮一峰在 bash-tutorial 写了入门教材《Bash教程》,可作为查阅手册。)