shell中的流程控制不能为空

if else

if 语句格式

1
2
3
4
5
6
7
if condition
then
command1
command2
...
commandN
fi

写成一行的形式,除了最后一个fi,每个语句后面都需要加上 ;进行语句分割,否则会报错

1
if [ "lop" = "lop" ]; then echo "true"; fi

if else 语句格式

前面说过流程控制不能为空,即如果if条件中else 的值为空,那么else就不要写。因此if 与if else 分开来讲。

1
2
3
4
5
6
7
8
9
if condition
then
command1
command2
...
commandN
else
command
fi

if else-if else 语句格式

1
2
3
4
5
6
7
8
9
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi

for 循环

语句格式

1
2
3
4
5
6
7
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done

实例

1
2
3
4
5
6
7
8
9
10
11
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done

# 输出为
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

也可以使用以下形式的语句

1
2
3
4
5
6
7
8
9
10
11
for ((i=1;i<=5;i++))
do
echo $i
done

# 输出为
1
2
3
4
5

while 循环

用于循环判断/读取信息,直到判断条件为假时退出。语句格式:

1
2
3
4
while condition
do
command
done

while还可以和read命令连用,用于循环读取信息

1
2
3
4
5
6
echo '按下 <CTRL-D> 退出'
echo -n '输入你的名字: '
while read NAME
do
echo "你好!${NAME}!"
done

这种方法会造成无限死循环,因此需要 CTRL-D 退出

无限循环

除了上面讲的通过while与read连用造成无限循环外,还可以使用下面几种方法进入无限循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1
while :
do
command
done

# 2
while true
do
command
done

# 3
for (( ; ; ))

until 循环

与while 循环在处理方式上正好相反,until 循环执行一系列命令直至条件为 true 时停止。语句格式:condition条件为假则一直执行

1
2
3
4
until condition
do
command
done

case

多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。语句格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac

举个栗子

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

输入不同的内容,会有不同的结果,例如:

1
2
3
4
输入 1 到 4 之间的数字:
你输入的数字为:
2
你选择了 2

esac作为case 语句的结束标志,与前面if 语句的fi 异曲同工。并且每个case分支用右圆括号,用两个分号表示break。

跳出循环

break 命令

break命令允许跳出所有循环(终止执行后面的所有循环),直接上例子

1
2
3
4
5
6
7
8
9
10
11
12
13
#! /bin/bash

while read num
do
echo "你输入的数字为:${num}"
if [ ${num} -eq 2]
then
echo "输入正确!"
break
else
echo "输入错误,请重新输入:"
fi
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 执行脚本
sh test.sh
3

# 输出为
你输入的数字为:3
输入错误,请重新输入:

# 执行脚本
sh test.sh
2

# 输出为
你输入的数字为:2
输入正确!

continue 命令

与break类似,但是不会跳出所有循环,仅仅跳出当前循环。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字: "
read Num
case $Num in
1|2|3|4|5) echo "你输入的数字为 $Num!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done

运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo “游戏结束” 永远不会被执行。