linux脚本控制,shell脚本编程——流程控制

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:编写脚本,实现如下功能:当输入的是自然数,提示是自然数,如果输入不是,则提示,输入不是自然数。#!/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

解释:如果输入的数中匹配到了数字以外的字符,则提示不是自然数,其他情况,则提示是自然数。

执行结果:

67fc2016b79d40031521e92b05333d50.png

二、case

1、语法

case 变量引用 in

PAT1)

分支1

;;

PAT2)

分支2

;;

...

*)

默认分支

;;

esac

case支持glob风格的通配符:

*: 任意长度任意字符

?: 任意单个字符

[]:指定范围内的任意单个字符

a|b: a或b

2、例子2:写出菜单,当用户输入菜单编号,则显示出价格

#!/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

执行结果:

2ad0c77f450f42f9e1111880b12f3a3a.png

三、for

1、语法

for 变量名 in 列表;do

循环体

done

列表生成方式:

(1)直接给出列表

例子3:打印1,2,3#!/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是变量名,可以换成其他名

执行结果:

45157e5f03e0e79d6b4321064d7a7c0b.png

(2) 整数列表:

(a) {start..end}

例子4:计算1+2+3+...+100#!/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 使用于变量的运算

执行结果:

4b51514ae9595f31e9387dfa45d58518.png

(b) $(seq [start[step]] end)

例子5:计算1+2+3+...+100#!/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)将命令执行的结果作为列表

执行结果:

3768f99bb4000657a793a48ef4e7e3c5.png

(3) 返回列表的命令

$(COMMAND)

(2)中的seq也是命令的引用

(4)使用glob,如:*.sh

例子6:依次显示出/var/log/下所有以.log 结尾文件的行数#!/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

执行结果:

28966de11639ceca21b3d783545bf9dc.png

(5) 变量引用;

$@, $*#!/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`。

执行结果:

75287ae47b95acd28f2a6bfd16211680.png

四、while

1、语法

while CONDITION; do

循环体

done

CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环

例子1:

#!/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

68339c5b1ba98108fc01bf5fef97bd8f.png

例子2:计算1+2+3+…+100#!/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时,执行下面操作。

执行结果:

690ea355e08510f505ec13cdc2c1e834.png

五、until

1、语法

until CONDITION; do

循环体

done

进入条件: CONDITION 为false

退出条件: CONDITION 为true

例子:当发现系统中有用户名为hacker ,立即让该用户退出登录#!/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用户后,

5666a11c14f5d4fea486e222d6741fee.png

执行该脚本,立即执行完

6bc6911e3ffb59238722134b413166ad.png

再次查看hacker登录,已经被踢出登录

9a66157cb2d81828d87778d90931b164.png

六、综合应用

1、对于上面例子中的menu,用户只能输入一次就退出,这里通过多种语法相结合,实现用户多次输入(while 与case结合)

#!/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

执行结果:

37d10df8e9ae67b090e208d87af8972f.png

2、打印棋盘(for 和case 结合)

#!/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

执行结果:

d54902416a80b45b267cee29a0065044.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值