从本节开始,学习的资料参阅RUNOOB.COM略有改动

续Shell脚本学习 Day7

shell流程控制之选择语句

if语句

见Day6

case … esac多选择语句

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

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

有没有发现一个有意思的地方,case反过来写e s a c就是它的结束标志,hahahaha,记住了嘛ヾ(◍°∇°◍)ノ゙

语法

1
2
3
4
5
6
7
8
case <值> in
<模式1>) #值与模式匹配时,执行;;前的命令语句
<命令>
;; #终止符
<模式2>)
<命令>
;;
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
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@localhost ~]# cat case.sh
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
[root@localhost ~]# bash case.sh
输入 1 到 4 之间的数字:
你输入的数字为:
1
你选择了 1
[root@localhost ~]# bash case.sh
输入 1 到 4 之间的数字:
你输入的数字为:
4
你选择了 4
[root@localhost ~]# bash case.sh
输入 1 到 4 之间的数字:
你输入的数字为:
5
你没有输入 1 到 4 之间的数字

shell流程控制之循环语句

for循环

有限循环用法

语法

1
2
3
4
5
6
7
8
9
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
#####一行#######
for var in item1 item2 ... itemN; do command1; command2… done;

实例

1
2
3
4
for loop in 1 2 3 4 5 #也可以使用{1..5}生成序列
do
echo "The value is: $loop"
done

执行演示

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# cat loop1.sh
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
[root@localhost ~]# bash loop1.sh
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

无限循环用法

语法

1
2
3
4
for (( ; ; )) #这一行不能动
do
<命令>
done

while循环

有限循环用法

语法

1
2
3
4
while <条件>
do
<命令>
done

实例

1
2
3
4
5
6
7
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo "The value is:$int"
let "int++" #实现增1
done

执行演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~]# cat loop2.sh
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo "The value is:$int"
let "int++" #实现增1
done
[root@localhost ~]# bash loop1.sh
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

无限循环用法

语法

1
2
3
4
while :
do
<命令>
done

或者

1
2
3
4
while true
do
<命令>
done

可以使用Ctrl+C打断

结合read的特殊用法

实例

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

执行演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# cat while2.sh
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
echo "是的!$FILM 是一个好网站"
done
[root@localhost ~]# bash while2.sh
按下 <CTRL-D> 退出
输入你最喜欢的网站名: runoob
是的!runoob 是一个好网站
baidu
是的!baidu 是一个好网站
lptexas.top
是的!lptexas.top 是一个好网站
[root@localhost ~]#

until 循环

until 循环执行一系列命令直至条件为 true 时停止

until 循环与 while 循环在处理方式上刚好相反

一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

语法

1
2
3
4
until <条件判断>
do
<命令>
done

实例

1
2
3
4
5
6
7
8
#!/bin/bash
a=0
until [ ! $a -lt 10 ] #大于等于10时停止
do
echo $a
a=`expr $a + 1`
#a=$[$a+1]
done

执行演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost ~]# cat until.sh
#!/bin/bash
a=0
until [ ! $a -lt 10 ] #大于等于10时停止
do
echo $a
a=`expr $a + 1`
done
[root@localhost ~]# bash until.sh
0
1
2
3
4
5
6
7
8
9

跳出循环

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell 使用两个命令来实现该功能:breakcontinue

break命令

break命令允许跳出所有循环(终止执行后面的所有循环)

实例

下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。

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

执行演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~]# cat case1.sh
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
break
;;
esac
done
[root@localhost ~]# bash case1.sh
输入 1 到 5 之间的数字:1
你输入的数字为 1!
输入 1 到 5 之间的数字:4
你输入的数字为 4!
输入 1 到 5 之间的数字:6
你输入的数字不是 1 到 5 之间的! 游戏结束

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 aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
continue
echo "我永远不会被执行!!!∑(゚Д゚ノ)ノ"
;;
esac
done

执行演示

注意continue后的echo语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost ~]# cat case2.sh
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
continue
echo "我永远不会被执行!!!∑(゚Д゚ノ)ノ" ####注意这段语句!!!!
;;
esac
done
[root@localhost ~]# bash case2.sh
输入 1 到 5 之间的数字:1
你输入的数字为 1!
输入 1 到 5 之间的数字:2
你输入的数字为 2!
输入 1 到 5 之间的数字:6
你输入的数字不是 1 到 5 之间的! 游戏结束