shell脚本编程——流程控制
2017-09-17 15:32
1011 查看
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
解释:如果输入的数中匹配到了数字以外的字符,则提示不是自然数,其他情况,则提示是自然数。
执行结果:![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/17/67fc2016b79d40031521e92b05333d50.png)
二、case
1、语法case 变量引用 in PAT1) 分支1 ;; PAT2) 分支2 ;; ... *) 默认分支 ;; esac
case支持glob风格的通配符:
*: 任意长度任意字符 ?: 任意单个字符 []:指定范围内的任意单个字符 a|b: a或b2、例子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执行结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/17/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是变量名,可以换成其他名 执行结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/17/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 使用于变量的运算 执行结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/17/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)将命令执行的结果作为列表 执行结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/17/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执行结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/17/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`。 执行结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/17/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
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/17/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时,执行下面操作。执行结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/17/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用户后,
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/17/5666a11c14f5d4fea486e222d6741fee.png)
执行该脚本,立即执行完
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/17/6bc6911e3ffb59238722134b413166ad.png)
再次查看hacker登录,已经被踢出登录
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/17/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
执行结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/17/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执行结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/17/d54902416a80b45b267cee29a0065044.png)
相关文章推荐
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
- 【Shell 编程基础第二部分】Shell里的流程控制\函数及\脚本调试
- Shell编程之流程控制
- shell脚本之流程控制语句
- Shell 编程(五)Shell流程控制
- Linux之shell编程之条件判断与流程控制
- shell脚本编程(严格的终端格式控制,美丽的输出字体颜色)
- shell脚本——流程控制的操作使用
- 【Linux 系统编程】shell 流程控制Loop和引号(三)
- shell脚本和流程控制
- shell脚本中if流程控制语句的应用
- shell 脚本之程序流程控制命令(1)
- shell脚本编程之循环控制语句(continue/break/sleep)
- Shell里的流程控制、Shell里的函数及脚本调试
- shell脚本之流程控制
- shell脚本编程(严格的终端格式控制,美丽的输出字体颜色)
- Shell 脚本-6- 流程控制之判断分支