shell中的流程控制不能为空
if else
if 语句格式
if condition
then
command1
command2
...
commandN
fi
写成一行的形式,除了最后一个fi,每个语句后面都需要加上 ;进行语句分割,否则会报错
if [ "lop" = "lop" ]; then echo "true"; fi
if else 语句格式
前面说过流程控制不能为空,即如果if条件中else 的值为空,那么else就不要写。因此if 与if else 分开来讲。
if condition
then
command1
command2
...
commandN
else
command
fi
if else-if else 语句格式
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
for 循环
语句格式
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
实例
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
也可以使用以下形式的语句
for ((i=1;i<=5;i++))
do
echo $i
done
# 输出为
1
2
3
4
5
while 循环
用于循环判断/读取信息,直到判断条件为假时退出。语句格式:
while condition
do
command
done
while还可以和read命令连用,用于循环读取信息
echo '按下 <CTRL-D> 退出'
echo -n '输入你的名字: '
while read NAME
do
echo "你好!${NAME}!"
done
这种方法会造成无限死循环,因此需要 CTRL-D 退出
无限循环
除了上面讲的通过while与read连用造成无限循环外,还可以使用下面几种方法进入无限循环
# 1
while :
do
command
done
# 2
while true
do
command
done
# 3
for (( ; ; ))
until 循环
与while 循环在处理方式上正好相反,until 循环执行一系列命令直至条件为 true 时停止。语句格式:condition条件为假则一直执行
until condition
do
command
done
case
多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。语句格式:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
举个栗子
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 到 4 之间的数字:
你输入的数字为:
2
你选择了 2
esac作为case 语句的结束标志,与前面if 语句的fi 异曲同工。并且每个case分支用右圆括号,用两个分号表示break。
跳出循环
break 命令
break命令允许跳出所有循环(终止执行后面的所有循环),直接上例子
#! /bin/bash
while read num
do
echo "你输入的数字为:${num}"
if [ ${num} -eq 2]
then
echo "输入正确!"
break
else
echo "输入错误,请重新输入:"
fi
done
# 执行脚本
sh test.sh
3
# 输出为
你输入的数字为:3
输入错误,请重新输入:
# 执行脚本
sh test.sh
2
# 输出为
你输入的数字为:2
输入正确!
continue 命令
与break类似,但是不会跳出所有循环,仅仅跳出当前循环。
#!/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 “游戏结束” 永远不会被执行。