未初始化,被赋值为null或被unset的变量在条件表达式里都是假。
a=a2="" # 也是nullb=1; unset bif [ ! $a ]; then echo "a is false"; fi# a is falseif [ ! $a2 ]; then echo "a2 is false"; fi# a2 is falseif [ ! $b ]; then echo "b is false"; fi# b is falseif [ ! $c ]; then echo "c is false"; fi# c is false
其他正常初始化的变量都是真
a=1b=0c=-1d="false"if [ $a ]; then echo "a is true"; fi# a is trueif [ $b ]; then echo "b is true"; fi# b is trueif [ $c ]; then echo "c is true"; fi# c is trueif [ $d ]; then echo "d is true"; fi# d is true
例如
true && echo hello# hello[ 1 -eq 1 ] && echo hello# hellofalse || echo hello# hello控制语句 if语句
if [condition]; then commands...
elif [condition2]; then
commands...
else
commands...
fi
elif和else都可省略。
支持多个if语句嵌套。
case语句
case的候选项可以使用bash的正则表达式,比如用*来实现c语言里default的功能。
case "$var" in "$value1")
commands...
;;
"$value2")
commands...
;;
esac
以下代码取自ABS
while [ $# -gt 0 ]; do # Until you run out of parameters . . . case "$1" in -d|--debug) DEBUG=1 ;;
-c|--conf) CONFFILE="$2" shift if [ ! -f $CONFFILE ]; then echo "Error: Supplied file doesn't exist!" exit $E_CONFFILE # File not found error. fi ;; esac shift # Check next set of parameters.done for循环
for arg in
do
commands...
done
例如
for i in $(seq 5); do echo $idone for循环的输出可以pipe到其他命令,例如
for f in $(ls); do echo $fdone | egrep "\.txt$"while循环
while [condition]; do commands...
done
例如,从标准输入读10次并输出,break continue和c语言里是一样的效果。
i=0limit=10while read value; do echo $value let i++ if [ $i -eq $limit ]; then break fidone 还可以在条件表达式里使用(()),例如
(( i = 0 ))(( limit = 10 ))while (( i < limit )); do echo $i (( i++ ))done# 0# 1# ...# 9until循环
类似while循环,区别是当条件为false时执行,当条件为true时停止。
until [condition is true]; do commands...
done 函数
# 定义 function_name() {
commands...
}
# 调用
function_name arg1 arg2 ... argN
在函数里用local定义的变量只能在函数体内使用。 函数参数
函数体内,使用位置参数$1, $2等来依此获取传入的参数。
在函数体内使用shift命令对函数的参数也有效。
使用$#来获取参数的个数。
函数返回值
可以使用return来终止函数并返回数据。
如果没有return语句,默认使用最后一条命令的退出状态来当作返回值。
可以使用$?来获取函数的返回值。
函数体内输入到标准输出的数据可以赋值给变量。
例子
一个比较脑惨的例子
show_params() { while [ "$#" -ne 0 ]; do echo $1 shift done return 0}nums=$(show_params 1 2 3)if [ "$?" -eq 0 ]; then echo "show_params function succeeded:" $numselse echo "show_params function failed"fi# show_params function succeeded: 1 2 3其他技巧 搜索子字符串
检查一个字符串$source是否包含某个字串$target,最方便的方法是
if [[ ${source} == *${target}* ]]; then ...
fi 其他工具
未完成 expr
字符串操作 seq bc sed awk 参考资料