shell脚本编程——流程控制
目 录
一、 if
二、 case
三、 for
四、 while
五、 until
六、 综合应用
一、if
1、语法
(1)单分支
if 判断条件;then
fi
(2)双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
(3)多分支
if 判断条件1; then
条件为真的分支代码
elif 判断条件2; then
条件为真的分支代码
elif 判断条件3; then
条件为真的分支代码
else
以上条件都为假的分支代码
fi
逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
2、例子1:编写脚本,实现如下功能:当输入的是自然数,提示是自然数,如果输入不是,则提示,输入不是自然数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#!/bin/bash
# ---------------------------------------------------------------
# Filename:checkint.sh
# Revision: 1.0
# Date: 2017-09-12
# Author: gm
# Website:
# Description:check int
# -------------------------------------------------------------
read
-p
"please input number: "
num
if
[[
"$num"
=~ [^[:digit:]] ]];
then
echo
"The number is not a int"
else
echo
"The number is a int"
fi
|
解释:如果输入的数中匹配到了数字以外的字符,则提示不是自然数,其他情况,则提示是自然数。
执行结果:
二、case
1、语法
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
case支持glob风格的通配符:
*: 任意长度任意字符
?: 任意单个字符
[]:指定范围内的任意单个字符
a|b: a或b
2、例子2:写出菜单,当用户输入菜单编号,则显示出价格
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
32
|
#!/bin/bash
# ------------------------------------------
# Filename: menu.sh
# Revision: 1.0
# Date: 2017-9-11
# Description: cai dan
# ------------------------------------------
echo
"menu
1.tang
2.rice
3.fruit
4.jiaozi
5.lamian
6.huimian
"
read
-p
"plaese input your food number: "
num
case
$num
in
1|4)
echo
The price is 20
;;
2|5)
echo
The price is 12
;;
3|6)
echo
The price is 10
;;
*)
echo
Please input again
;;
esac
|
解释:通过读取用户输入的数字;如果是1或4 ,提示The price is 20 。因为2号商品和4号商品价格一样,可以写在一起。case支持glob风格。当不满足以上三个case时,用*)表示出以上情况,其他的输入都提示 Please input again
执行结果:
三、for
1、语法
for 变量名 in 列表;do
循环体
done
列表生成方式:
(1) 直接给出列表
例子3:打印1,2,3
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/bin/bash
# ---------------------------------------------------------------
# Filename: a.sh
# Revision: 1.0
# Date: 2017-09-17
# Author: gm
# Website:
# Description: echo 1,2,3
# -------------------------------------------------------------
for
line
in
1 2 3;
do
echo
$line
done
|
解释:line是变量名,可以换成其他名
执行结果:
(2) 整数列表:
(a) {start..end}
例子4:计算1+2+3+...+100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/bin/bash
# ---------------------------------------------------------------
# Filename: aa.sh
# Revision: 1.0
# Date: 2017-09-17
# Author: gm
# Website:
# Description:1+2+3+...+100
# -------------------------------------------------------------
sum
=0
for
i
in
{1..100};
do
let
sum
=
sum
+i
done
echo
$
sum
|
解释:let 使用于变量的运算
执行结果:
(b) $(seq [start[step]] end)
例子5:计算1+2+3+...+100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/bin/bash
# ---------------------------------------------------------------
# Filename: bb.sh
# Revision: 1.0
# Date: 2017-09-17
# Author: gm
# Website:
# Description:
# -------------------------------------------------------------
sum
=0
for
i
in
`
seq
1 100`;
do
let
sum
=
sum
+i
done
echo
$
sum
|
解释:seq 1 100 显示出1-100个数,$(command)或者`command` 引用命令执行的结果。$(seq 1 100)将命令执行的结果作为列表
执行结果:
(3) 返回列表的命令
$(COMMAND)
(2)中的seq也是命令的引用
(4) 使用glob, 如: *.sh
例子6:依次显示出/var/log/下所有以.log 结尾文件的行数
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/bin/bash
# ---------------------------------------------------------------
# Filename: cc.sh
# Revision: 1.0
# Date: 2017-09-17
# Author: gm
# Website:
# Description:/var/log/*.log
# -------------------------------------------------------------
for
file
in
/var/log/
*.log;
do
wc
-l $
file
done
|
执行结果:
(5) 变量引用;
$@, $*
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/bin/bash
# ---------------------------------------------------------------
# Filename: dd.sh
# Revision: 1.0
# Date: 2017-09-17
# Author: gm
# Website:
# Description:1+2+3+..+n
# -------------------------------------------------------------
sum
=0
for
i
in
`
seq
1 $1`;
do
let
sum
=
sum
+i
done
echo
$
sum
|
解释:引用用户输入参数作为列表,$1表示用户输入的第一个参数。更加的灵活,注意:这里不能使用{1..$1},{}引用变量显示不出来,可以用`seq 1 $1`。
执行结果:
四、while
1、语法
while CONDITION; do
循环体
done
CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环
例子1:
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/bin/bash
# ---------------------------------------------------------------
# Filename: ee.sh
# Revision: 1.0
# Date: 2017-09-17
# Author: gm
# Website:
# Description:
# -------------------------------------------------------------
while
true
;
do
echo
"hello"
done
|
解释:true 一直为真,所以会一直执行循环体,所以这是个死循环。而且执行后,最好立即按ctrl+c停下,这是个死循环,不会自己停下,最终会造成系统资源耗尽而四级
执行结果:由于执行速度太快,我迅速按下ctrl+c后已经向上翻不到执行脚本的命令了,执行脚本命令./dd.sh
例子2:计算1+2+3+…+100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#!/bin/bash
# ---------------------------------------------------------------
# Filename: ff.sh
# Revision: 1.0
# Date: 2017-09-17
# Author: gm
# Website:
# Description:
# -------------------------------------------------------------
i=1
sum
=0
while
[ $i -
le
100 ];
do
let
sum
=
sum
+i
let
i++
done
echo
$
sum
|
解释:当i小于或等于100时,执行下面操作。
执行结果:
五、until
1、语法
until CONDITION; do
循环体
done
进入条件: CONDITION 为false
退出条件: CONDITION 为true
例子:当发现系统中有用户名为hacker ,立即让该用户退出登录
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/bin/bash
# ---------------------------------------------------------------
# Filename: login.sh
# Revision: 1.0
# Date: 2017-09-13
# Author: gm
# Website:
# Description: test user login
# -------------------------------------------------------------
until
who
|
grep
-q
"^hacker\>"
;
do
sleep
1
done
pkill -9 -u hacker
|
解释:who|grep -q "^hacker\>" 查找用户名为hacker,当没有找到时,一直循环,休眠1秒,sleep 1,一旦发现hacker用户。直接让用户退出登录,脚本执行完立即退出
执行结果:当登录上hacker用户后,
执行该脚本,立即执行完
再次查看hacker登录,已经被踢出登录
六、综合应用
1、对于上面例子中的menu,用户只能输入一次就退出,这里通过多种语法相结合,实现用户多次输入(while 与case结合)
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
32
33
34
35
36
37
|
#!/bin/bash
# ------------------------------------------
# Filename:menu.sh
# Revision: 1.0
# Date: 2017-9-11
# Description: caidan
# ------------------------------------------
echo
"menu
1.yangroutang
2.mifan
3.hulatang
4.jiaozi
5.lamian
6.huimian
"
while
read
-p
"plaese input your food number(quit is exit): "
num;
do
case
$num
in
1|4)
echo
The price is 20
;;
2|5)
echo
The price is 12
;;
3|6)
echo
The price is 10
;;
quit)
exit
;;
*)
echo
Please input again
;;
esac
done
|
执行结果:
2、打印棋盘(for 和case 结合)
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
|
#!/bin/bash
# ------------------------------------------
# Filename:xiangqi.sh
# Revision: 1.0
# Date: 2017-9-11
# Description:
# ------------------------------------------
huang=`
echo
-e
"\033[1;43m \033[0m"
`
lan=`
echo
-e
"\033[1;44m \033[0m"
`
hong=`
echo
-e
"\033[1;41m \033[0m"
`
for
i
in
{1..24};
do
num=`
echo
$[($i-1)
/3
]`
mo=$[num%2]
case
$mo
in
0)
for
j
in
{1..4};
do
echo
-n
"$huang$lan"
done
echo
;;
*)
for
j
in
{1..4};
do
echo
-n
"$lan$huang"
done
echo
;;
esac
done
unset
huang lan hong num
|
执行结果:
本文转自 hawapple 51CTO博客,原文链接:http://blog.51cto.com/guanm/1966049