Shell流程控制

if条件判断语句

1
2
3
4
5
6
7
if 表达式 ; then
语句1
elif 表达式 ; then # 可以不要
语句2
else # 可以不要
语句3
fi

表达式可以用到的逻辑运算符:

选项 含义
-f 判断文件是否存在eg: if [ -f filename ]
-d 判断目录是否存在eg: if [ -d dir ]
-eq 等于 应用于:整型比较
-ne 不等于 应用于:整型比较
-lt 小于 应用于:整型比较
-gt 大于 应用于:整型比较
-le 小于或等于 应用于:整型比较
-ge 大于或等于 应用于:整型比较
-a and。 eg: [ 表达式 -a 表达式 ]
-o or。eg: [ 表达式 -o 表达式 ]
-z 空字符串

如果使用 ((…)) 作为判断语句,大于和小于可以直接使用 > 和 <。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
a=10
b=20
if (( $a == $b ))
then
echo "a 等于 b"
elif (( $a > $b ))
then
echo "a 大于 b"
elif (( $a < $b ))
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi

if else 语句经常与 test 命令结合使用,如下所示:

1
2
3
4
5
6
7
8
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi

for 循环

与其他编程语言类似,Shell支持for循环。这里直接给出例子:

1
2
3
4
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done

while 语句

直接给出例子:以下是一个基本的 while 循环,测试条件是:如果 i 小于等于 5,那么条件返回真。i 从 1 开始,每次循环处理时,i 加 1。运行上述脚本,返回数字 1 到 5,然后终止。

1
2
3
4
5
6
7
#!/bin/bash
i=1
while(( $i<=5 ))
do
echo $i
let i++
done

以上实例使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令。while循环可用于读取键盘信息。下面的例子中,给出了一个持续交互的while循环。

1
2
3
4
5
6
7
8
9
10
echo '-----------------------'
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
echo "是的!$FILM 是一个好网站"
echo '-----------------------'
echo '按下 <CTRL-D> 退出'
echo -n '接着输入你最喜欢的网站名: '
done

无限循环

1
2
3
4
while true
do
COMMAND
done

Shell的循环同样可以用关键词breakcontinue跳出,continue跳出当前循环,而break跳出所有循环。

until 循环

until 循环与 while 循环在处理方式上刚好相反,until 循环执行一系列命令直至条件为 true 时停止。一般 while 循环优于 until 循环,但在某些时候也只是极少数情况下,until 循环更加有用。condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。以下实例我们使用 until 命令来输出 0 ~ 9 的数字:

1
2
3
4
5
6
7
8
#!/bin/bash
a=0

until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done

case语句

case为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。

case 取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;; 。取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用**星号 *** 捕获该值,再执行后面的命令。下面的脚本提示输入 1 到 4,与每一种模式进行匹配:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac