循环与分支
测试一个表达式
可以用test或[ ... ]
与文件相关的测试
是否存在:-e或-a
是否是文件:-f
是否是目录:-d
是否是一个符号链接:-h或-L
是否可执行:-x
等
整数比较
是否相等:-eq
是否不相等:-ne
类似还有:-gt(大于),-lt(小于),-ge(大于等于),-le(小于等于)
如输入:
test 1 -eq 1
echo $?
则输出为0
字符串测试
测试两个字符串是否相等可以用=和!=号
如
test "$a" = "$b"
[ "$q" != "$b" ]
注意变量用双引号引起来,这样做是为了使变量为空时不会出错,另外等号和不等号左右两边都有空格,还有就是‘[’号后和‘]’号前都要有空格。
字符串是否为空:-z
字符串是否不为空:-n
>和<经过转义后可用来对两个字符串进行比较,如
str1=abc
str2=def
test "$str1" \< "$str2"
echo $?
输出会是0。
多个判断可以用-a(AND)和-o(OR)连接起来
如:
test -f /path/to/file -a $test -eq 1
test -x bin/file -o $test -gt 1
test -x bin/file -o $test -gt 1
[[是[的增强,可以支持更复杂的式子(比如正则表达式等)。
例:
string=whatever
[[ $string =~ h[aeiou] ]]
echo $?
将会输出0。
((可以用来计算表达式,如
(( a = $a + 3 ))
会将a的值增加3。
test $(( $a - 2 )) -ne 0
用于比较a - 2的值是不是不等于0。
分支语句
if
if语句的形式为:
if <condition list>
then
<list>
fi
如果加上一个else的话,形式为:
if <condition list>
then
<list>
else
<list>
fi
如果还有else if的话,形式为:
if <condition list>
then
<list>
elif <condition list>
then
<list>
else
<list>
fif
例:
printf "Enter a number between 10 and 20 inclusive: "
read number
if [ "$number" -lt 10 ]
then
printf "%d is too low\n" "$number" >&2
exit 1
elif [ "$number" -gt 20 ]
then
printf "%d is too high\n" "$number" >&2
exit 1
else
printf "You entered %d\n" "$number"
fi
判断语句中可以使用&&和||与C语言中的与和或一样。
也可以这样认为:
只有当&&前面的语句正常执行了,其后面的语句才会执行(这就相当于只有&&前面为true才会看后面的,否则肯定整个语句为false)
只有当||前面的语名没有正常执行时,其后面的语句才会执行。
例如:
mkdir "$HOME/bin" && cd "$HOME/bin" || exit 1
会创建一个目录并进入该目录,如果两者有一个不成功,则会执行exit 1
if [ -d "$dir" ] && cd "$dir"
then
echo "$PWD"
fi
等等。
case
形式为:
case WORD in
PATTERN) COMMAND;;
PATTERN) COMMAND;;
esac
PATTERN可以是路径扩展模式(pathname expansion patterns),以*和?为通配符。也可以是符号串或[ ... ]表示范围。
例:
case $1 in
*"$2"*) true ;;
*) false ;;
esac
可用于判断字符串$2是不是$1的子串。(注:此方法比用grep来判断要快,因为它不会产生新进程。)
case $1 in
*[!0-9]*) false;;
*) true ;;
esac
可用于判断$1是不是整数。
case $# in
3) ;; ## We need 3 args, so do nothing
*) printf "%s\n" "Please provide three names" >&2
exit 1
;;
esac
用于判断参数个数是否为3。
循环语句
while
形式为:
while <list>
do
<list>
done
例:
n=1
while [ $n -le 10 ]
do
echo "$n"
n=$(( $n + 1 ))
done
while IFS= read -r line
do
: do something with "$line"
done < FILENAME
从文件FILENAME中一次读一行进行操作。
until
类似
n=1
until [ $n -gt 10 ]
do
echo "$n"
n=$(( $n + 1 ))
done
for
会从一个list中依次取值进行操作。
例:
for var in Canada USA Mexico
do
printf "%s\n" "$var"
done
也可以跟C语言类似,如:
for (( n=1; n<=10; ++n ))
do
echo "$n"
done
bread和continue
如C语言类似
while :
do
read x
[ -z "$x" ] && break
done
在break后可以接数字,从而跳出更外层的循环。
如:
for n in a b c d e
do
while true
do
if [ $RANDOM -gt 20000 ]
then
printf .
break 2 ## break out of both while and for loops
elif [ $RANDOM -lt 10000 ]
then
printf '"'
break ## break out of the while loop
fi
done
done
总结
相关命令
test:计算一个表达式并返回成功或失败。
if,case,while, until, for, break, continue