博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Shell从入门到精通进阶之四:流程控制
阅读量:5227 次
发布时间:2019-06-14

本文共 5296 字,大约阅读时间需要 17 分钟。

 

流程控制是改变程序运行顺序的指令。

4.1 if语句

4.1.1 单分支

if 条件表达式; then    命令fi

示例:

#!/bin/bashN=10if [ $N -gt 5 ]; then    echo yesfi# bash test.shyes

4.1.2 双分支

if 条件表达式; then    命令else    命令fi

示例1:

#!/bin/bashN=10if [ $N -lt 5 ]; then    echo yeselse    echo nofi# bash test.shno

示例2:判断crond进程是否运行

 

#!/bin/bashNAME=crondNUM=$(ps -ef |grep $NAME |grep -vc grep)if [ $NUM -eq 1 ]; then    echo "$NAME running."else    echo "$NAME is not running!"fi

示例3:检查主机是否存活

#!/bin/bashif ping -c 1 192.168.1.1 >/dev/null;then         echo "OK."else         echo "NO!"fi

if语句可以直接对命令状态进行判断,就省去了获取$?这一步!

4.1.3 多分支

if 条件表达式; then    命令elif 条件表达式; then    命令else    命令fi

 

当不确定条件符合哪一个时,就可以把已知条件判断写出来,做相应的处理。

示例1:

#!/bin/bashN=$1if [ $N -eq 3 ]; then   echo "eq 3"elif [ $N -eq 5 ]; then   echo "eq 5"elif [ $N -eq 8 ]; then   echo "eq 8"else   echo "no"fi

如果第一个条件符合就不再向下匹配。

 

示例2:根据Linux不同发行版使用不同的命令安装软件

#!/bin/bashif [ -e /etc/redhat-release ]; then   yum install wget -yelif [ $(cat /etc/issue |cut -d' ' -f1`) =="Ubuntu" ]; then   apt-get install wget -yelse   Operating system does not support.   exitfi

4.2 for语句

for 变量名 in 取值列表; do    命令done

 

示例:

#!/bin/bashfor i in {1..3}; do    echo $idone# bash test.sh123

for的语法也可以这么写:

#!/bin/bashfor i in $@; {    echo $i}# bash test.sh 1 2 3123

默认for循环的取值列表是以空白符分隔,也就是第一章讲系统变量里的$IFS:

#!/bin/bashfor i in 12 34; do    echo $idone# bash test.sh1234

 

如果想指定分隔符,可以重新赋值$FS变量:

#!/bin/bashOLD_IFS=$IFSIFS=":"for i in $(head -1 /etc/passwd); do   echo $idoneIFS=$OLD_IFS   # 恢复默认值# bash test.sh   rootx00root/root/bin/bash

for循环还有一种C语言风格的语法:

#!/bin/bashfor ((i=1;i<=5;i++)); do    echo $idone

 

 

示例1:检查多个主机是否存活

#!/bin/bashfor ip in 192.168.1.{1..254}; do   if ping -c 1 $ip >/dev/null; then       echo "$ip OK."   else       echo "$ip NO!"   fidone

 

示例2:检查多个域名是否可以访问

#!/bin/bashURL="www.baidu.com www.sina.comwww.jd.com"for url in $URL; do   HTTP_CODE=$(curl -o /dev/null -s -w %{http_code} http://$url)   if [ $HTTP_CODE -eq 200 -o $HTTP_CODE -eq 301 ]; then       echo "$url OK."   else       echo "$url NO!"   fidone

4.3 while语句

while 条件表达式; do    命令done

示例1:

#!/bin/bashN=0while [ $N -lt 5 ]; do    let N++    echo $Ndone# bash test.sh12345

当条件表达式为true时,终止循环。

示例2:条件表达式为true,将会产生死循环

#!/bin/bashwhile [ 1 -eq 1 ]; do    echo "yes"done

也可以条件表达式直接用true:

#!/bin/bashwhile true; do    echo "yes"done

还可以条件表达式用冒号,冒号在Shell中的意思是不做任何操作。但状态是0,因此为true:

#!/bin/bashwhile :; do    echo "yes"done

示例3:在死循环中,满足条件终止循环

#!/bin/bashN=0while true; do    let N++    if [ $N -eq 5 ]; then        break    fi    echo $Ndone# bash test.sh1234

里面用了if判断,并用了break语句,它是跳出循环。与其关联的还有一个continue语句,它是跳出本次循环。

示例4:举例子说明continue用法

#!/bin/bashN=0while [ $N -lt 5 ]; do    let N++    if [ $N -eq 3 ]; then        continue    fi    echo $Ndone# bash test.sh1245

当变量N等于3时,continue跳过了当前循环,没有执行下面的echo。

注意:continue与break语句只能循环语句中使用。

示例5:逐行处理文本

文本内容:

# cat a.txta b c1 2 3x y z

要想使用while循环逐行读取a.txt文件,有三种方式:

方式1:#!/bin/bashcat ./a.txt | while read LINE; do    echo $LINEdone方式2:#!/bin/bashwhile read LINE; do    echo $LINEdone < ./a.txt方式3:#!/bin/bashexec < ./a.txt  # 读取文件作为标准输出while read LINE; do    echo $LINEdone

与while关联的还有一个until语句,它与while不同之处在于,是当条件表达式为false时才循环,实际使用中比较少,这里不再讲解。

4.4 case语句

case语句一般用于选择性来执行对应部分块命令。

case 模式名 in    模式1)        命令        ;;    模式2)        命令        ;;    *)        不符合以上模式执行的命令esac

每个模式必须以右括号结束,命令结尾以双分号结束。

示例:根据位置参数匹配不同的模式

#!/bin/bashcase $1 in    start)        echo "start."        ;;    stop)        echo "stop."        ;;    restart)        echo "restart."        ;;    *)        echo "Usage: $0 {start|stop|restart}"esac   # bash test.shUsage: test.sh {start|stop|restart}# bash test.sh startstart.# bash test.sh stopstop.# bash test.sh restartrestart.

上面例子是不是有点眼熟,在Linux下有一部分服务启动脚本都是这么写的。

模式也支持正则,匹配哪个模式就执行那个:

#!/bin/bashcase $1 in    [0-9])        echo "match number."        ;;    [a-z])        echo "match letter."        ;;    '-h'|'--help')        echo "help"    *)        echo "Input error!"        exitesac   # bash test.sh 1match number.# bash test.sh amatch letter.# bash test.sh -hhelp# bash test.sh --helphelp

模式支持的正则有:*、?、[ ]、[.-.]、|。后面有章节单独讲解Shell正则表达式。

4.5 select语句

select是一个类似于for循环的语句。

select 变量 in 选项1 选项2; do    breakdone

示例:

#!/bin/bashselect mysql_version in 5.1 5.6; do    echo $mysql_versiondone# bash test.sh1) 5.12) 5.6#? 15.1#? 25.6

用户输入编号会直接赋值给变量mysql_version。作为菜单用的话,循环第二次后就不再显示菜单了,并不能满足需求。

在外面加个死循环,每次执行一次select就break一次,这样就能每次显示菜单了:

#!/bin/bashwhile true; do    select mysql_version in 5.1 5.6; do        echo $mysql_version        break    donedone# bash test.sh1) 5.12) 5.6#? 15.11) 5.12) 5.6#? 25.61) 5.12) 5.6

如果再判断对用户输入的编号执行相应的命令,如果用if语句多分支的话要复杂许多,用case语句就简单多了。

#!/bin/bashPS3="Select a number: "while true; do    select mysql_version in 5.1 5.6 quit; do        case $mysql_version in            5.1)                echo "mysql 5.1"                break                ;;            5.6)                echo "mysql 5.6"                break                ;;            quit)                exit                ;;            *)                 echo "Input error, Please enter again!"                break        esac    donedone# bash test.sh1) 5.12) 5.63) quitSelect a number: 1mysql 5.11) 5.12) 5.63) quitSelect a number: 2mysql 5.61) 5.12) 5.63) quitSelect a number: 3

如果不想用默认的提示符,可以通过重新赋值变量PS3来自定义。这下就比较完美了!

 

转载于:https://www.cnblogs.com/521football/p/10435564.html

你可能感兴趣的文章
303. Range Sum Query - Immutable
查看>>
图片加载失败显示默认图片占位符
查看>>
【★】浅谈计算机与随机数
查看>>
《代码阅读方法与实现》阅读笔记一
查看>>
解决 sublime text3 运行python文件无法input的问题
查看>>
javascript面相对象编程,封装与继承
查看>>
Atlas命名空间Sys.Data下控件介绍——DataColumn,DataRow和DataTable
查看>>
Java中正则表达式的使用
查看>>
算法之搜索篇
查看>>
新的开始
查看>>
java Facade模式
查看>>
NYOJ 120校园网络(有向图的强连通分量)(Kosaraju算法)
查看>>
SpringAop与AspectJ
查看>>
Leetcode 226: Invert Binary Tree
查看>>
http站点转https站点教程
查看>>
解决miner.start() 返回null
查看>>
bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
查看>>
BZOJ 1001--[BeiJing2006]狼抓兔子(最短路&对偶图)
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
查看>>