Shell从入门到精通进阶之四:流程控制
流程控制是改变程序运行顺序的指令。
4.1 if语句
4.1.1 单分支
if 条件表达式; then
    命令
fi示例:
#!/bin/bash
N=10
if [ $N -gt 5 ]; then
    echo yes
fi
# bash test.sh
yes4.1.2 双分支
if 条件表达式; then
    命令
else
    命令
fi示例1:
#!/bin/bash
N=10
if [ $N -lt 5 ]; then
    echo yes
else
    echo no
fi
# bash test.sh
no示例2:判断crond进程是否运行
#!/bin/bash
NAME=crond
NUM=$(ps -ef |grep $NAME |grep -vc grep)
if [ $NUM -eq 1 ]; then
    echo "$NAME running."
else
    echo "$NAME is not running!"
fi示例3:检查主机是否存活
#!/bin/bash
if ping -c 1 192.168.1.1 >/dev/null;then
        echo "OK."
else
        echo "NO!"
fiif语句可以直接对命令状态进行判断,就省去了获取$?这一步!
4.1.3 多分支
if 条件表达式; then
    命令
elif 条件表达式; then
    命令
else
    命令
fi当不确定条件符合哪一个时,就可以把已知条件判断写出来,做相应的处理。
示例1:
#!/bin/bash
N=$1
if [ $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/bash
if [ -e /etc/redhat-release ]; then
   yum install wget -y
elif [ $(cat /etc/issue |cut -d' ' -f1`) =="Ubuntu" ]; then
   apt-get install wget -y
else
   Operating system does not support.
   exit
fi4.2 for语句
for 变量名 in 取值列表; do
    命令
done示例:
#!/bin/bash
for i in {1..3}; do
    echo $i
done
# bash test.sh
1
2
3for的语法也可以这么写:
#!/bin/bash
for i in $@; {
    echo $i
}
# bash test.sh 1 2 3
1
2
3默认for循环的取值列表是以空白符分隔,也就是第一章讲系统变量里的$IFS:
#!/bin/bash
for i in 12 34; do
    echo $i
done
# bash test.sh
12
34如果想指定分隔符,可以重新赋值$FS变量:
#!/bin/bash
OLD_IFS=$IFS
IFS=":"
for i in $(head -1 /etc/passwd); do
   echo $i
done
IFS=$OLD_IFS   # 恢复默认值
# bash test.sh
root
x
0
0
root
/root
/bin/bashfor循环还有一种C语言风格的语法:
#!/bin/bash
for ((i=1;i<=5;i++)); do
    echo $i
done示例1:检查多个主机是否存活
#!/bin/bash
for ip in 192.168.1.{1..254}; do
   if ping -c 1 $ip >/dev/null; then
       echo "$ip OK."
   else
       echo "$ip NO!"
   fi
done示例2:检查多个域名是否可以访问
#!/bin/bash
URL="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!"
   fi
done4.3 while语句
while 条件表达式; do
    命令
done示例1:
#!/bin/bash
N=0
while [ $N -lt 5 ]; do
    let N++
    echo $N
done
# bash test.sh
1
2
3
4
5当条件表达式为true时,终止循环。
示例2:条件表达式为true,将会产生死循环
#!/bin/bash
while [ 1 -eq 1 ]; do
    echo "yes"
done也可以条件表达式直接用true:
#!/bin/bash
while true; do
    echo "yes"
done还可以条件表达式用冒号,冒号在Shell中的意思是不做任何操作。但状态是0,因此为true:
#!/bin/bash
while :; do
    echo "yes"
done示例3:在死循环中,满足条件终止循环
#!/bin/bash
N=0
while true; do
    let N++
    if [ $N -eq 5 ]; then
        break
    fi
    echo $N
done
# bash test.sh
1
2
3
4里面用了if判断,并用了break语句,它是跳出循环。与其关联的还有一个continue语句,它是跳出本次循环。
示例4:举例子说明continue用法
#!/bin/bash
N=0
while [ $N -lt 5 ]; do
    let N++
    if [ $N -eq 3 ]; then
        continue
    fi
    echo $N
done
# bash test.sh
1
2
4
5当变量N等于3时,continue跳过了当前循环,没有执行下面的echo。
注意:continue与break语句只能循环语句中使用。
示例5:逐行处理文本
文本内容:
# cat a.txt
a b c
1 2 3
x y z要想使用while循环逐行读取a.txt文件,有三种方式:
方式1:
#!/bin/bash
cat ./a.txt | while read LINE; do
    echo $LINE
done
方式2:
#!/bin/bash
while read LINE; do
    echo $LINE
done < ./a.txt
方式3:
#!/bin/bash
exec < ./a.txt  # 读取文件作为标准输出
while read LINE; do
    echo $LINE
done与while关联的还有一个until语句,它与while不同之处在于,是当条件表达式为false时才循环,实际使用中比较少,这里不再讲解。
4.4 case语句
case语句一般用于选择性来执行对应部分块命令。
case 模式名 in
    模式1)
        命令
        ;;
    模式2)
        命令
        ;;
    *)
        不符合以上模式执行的命令
esac每个模式必须以右括号结束,命令结尾以双分号结束。
示例:根据位置参数匹配不同的模式
#!/bin/bash
case $1 in
    start)
        echo "start."
        ;;
    stop)
        echo "stop."
        ;;
    restart)
        echo "restart."
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
esac  
# bash test.sh
Usage: test.sh {start|stop|restart}
# bash test.sh start
start.
# bash test.sh stop
stop.
# bash test.sh restart
restart.上面例子是不是有点眼熟,在Linux下有一部分服务启动脚本都是这么写的。
模式也支持正则,匹配哪个模式就执行那个:
#!/bin/bash
case $1 in
    [0-9])
        echo "match number."
        ;;
    [a-z])
        echo "match letter."
        ;;
    '-h'|'--help')
        echo "help"
    *)
        echo "Input error!"
        exit
esac
# bash test.sh 1
match number.
# bash test.sh a
match letter.
# bash test.sh -h
help
# bash test.sh --help
help模式支持的正则有:*、?、[ ]、[.-.]、|。后面有章节单独讲解Shell正则表达式。
4.5 select语句
select是一个类似于for循环的语句。
select 变量 in 选项1 选项2; do
    break
done示例:
#!/bin/bash
select mysql_version in 5.1 5.6; do
    echo $mysql_version
done
# bash test.sh
1) 5.1
2) 5.6
#? 1
5.1
#? 2
5.6用户输入编号会直接赋值给变量mysql_version。作为菜单用的话,循环第二次后就不再显示菜单了,并不能满足需求。
在外面加个死循环,每次执行一次select就break一次,这样就能每次显示菜单了:
#!/bin/bash
while true; do
    select mysql_version in 5.1 5.6; do
        echo $mysql_version
        break
    done
done
# bash test.sh
1) 5.1
2) 5.6
#? 1
5.1
1) 5.1
2) 5.6
#? 2
5.6
1) 5.1
2) 5.6如果再判断对用户输入的编号执行相应的命令,如果用if语句多分支的话要复杂许多,用case语句就简单多了。
#!/bin/bash
PS3="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
    done
done
# bash test.sh
1) 5.1
2) 5.6
3) quit
Select a number: 1
mysql 5.1
1) 5.1
2) 5.6
3) quit
Select a number: 2
mysql 5.6
1) 5.1
2) 5.6
3) quit
Select a number: 3如果不想用默认的提示符,可以通过重新赋值变量PS3来自定义。这下就比较完美了!
Shell从入门到精通进阶之四:流程控制的更多相关文章
- 【java从入门到精通】day08-java流程控制-用户交互Scanner--顺序结构--选择结构
		1.java流程控制 Scanner对象: Java提供了一个工具类,可以获取用户的输入 java.until.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入 基本语 ... 
- shell从入门到精通进阶之一:Shell基础知识
		1.1 简介 Shell是一个C语言编写的脚本语言,它是用户与Linux的桥梁,用户输入命令交给Shell处理,Shell将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户. 下面是处 ... 
- Shell从入门到精通进阶之三:表达式与运算符
		3.1 条件表达式 表达式 示例 [ expression ] [ 1 -eq 1 ] ` expression ` ` 1 -eq 1 ` test expression test 1 -eq 1 ... 
- Shell从入门到精通进阶之二:Shell字符串处理之${}
		上一章节讲解了为什么用${}引用变量,${}还有一个重要的功能,就是文本处理,单行文本基本上可以满足你所有需求. 2.1 获取字符串长度 # VAR='hello world!' # echo $VA ... 
- 【java从入门到精通】day10-Java流程控制2-switch多选择结构
		1.switch多选择结构 switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. switch语句中的变量类型可以是: byte.short.int或者char 从j ... 
- python入门篇之介绍和流程控制(一)
		Python入门 一.第一句python代码 很多语言的第一句python代码都是以“你好,世界”开始的,那么我们的python也是如此. 在 /home/dev/ 目录下创建 hello.py 文件 ... 
- FFmpeg从入门到精通——进阶篇,SEI那些事儿
		前言 在直播应用的开发过程中,如果把主播端消息事件传递到观众端,一般会以Instant Messaging(即时通讯)的方式传递过去,但因为消息分发通道和直播通道是分开的,因此消息与直播音视频数据的同 ... 
- Jmeter(三十四) - 从入门到精通进阶篇 - 参数化(详解教程)
		1.简介 前边三十多篇文章主要介绍的是Jmeter的一些操作和基础知识,算是一些初级入门的知识点,从这一篇开始我们就来学习Jmeter比较高级的操作和深入的知识点了.今天这一篇主要是讲参数化,其实前边 ... 
- Shell从入门到精通
		熟悉基本shell操作不仅是运维的基本功,对于开发来说也是多多益善,我在学习的过程中,总结了十个练手的小demo,并附上涉及的知识点,仅供娱乐. 1. 多线程ping监控,检查同一网段的IP是否连通 ... 
随机推荐
- noip前集训
			10.18 关网了,2333 上午考试,130 rank16 一直在刚T2的割点,却直接弃了一道第一眼看上去不可做但实际并没那么难想的小模拟 但是T2没搞出来是不是也要反思一下,先是割点板子忘了,之后 ... 
- BZOJ_4003_[JLOI2015]城池攻占_可并堆
			BZOJ_4003_[JLOI2015]城池攻占_可并堆 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 ... 
- turtle文库 ——python
			本文将会为您介绍关于python--turtle库函数,学会这个库函数,会有很多让你意想不到的事情发生哦! 我也也会为你们,简单的编写几个代码,让你们看一下turtle函数的魅力 Turtle库是Py ... 
- centos7 启动docker失败的解决
			控制端使用yum install docker安装完成docker后启动docker失败,出现以下信息: Job for docker.service failed because the contr ... 
- 大白话5分钟带你走进人工智能-第四节最大似然推导mse损失函数(深度解析最小二乘来源)(2)
			第四节 最大似然推导mse损失函数(深度解析最小二乘来源)(2) 上一节我们说了极大似然的思想以及似然函数的意义,了解了要使模型最好的参数值就要使似然函数最大,同时损失函数(最小二乘)最小,留下了一 ... 
- 【转】超酷的 mip-infinitescroll 无限滚动(无限下拉)
			写在前面 无限滚动技术(又叫做无限下拉技术)被广泛应用于新闻类,图片预览类网站.对用户来讲,使用无限滚动的页面有源源不断的信息可以预览,增加用户在页面的停留时长.技术上原理也很简单,在页面加载时加载一 ... 
- Netty4.x整合SpringBoot2.x使用Protobuf3详解
			前言 本篇文章主要介绍的是SpringBoot整合Netty以及使用Protobuf进行数据传输的相关内容.Protobuf会介绍下用法,至于Netty在netty 之 telnet HelloWor ... 
- 由ORACLE:ORA-28001: the password has expired(密码过期)引起ODI资料库连接失败
			今天,连接ODI,出现下面的错误 oracle.odi.core.config.WorkRepositoryResourceFailureException: ODI-10182: 资料档案库访问期间 ... 
- Access2007数据库下载地址与AccessHelper
			链接:https://pan.baidu.com/s/1pLzOlTv0nqSbhzujHZht1w 提取码:1m9l AccessHelper: using System; using System ... 
- 天津联通新兴ICT业务工程师面试经历
			此次是天津联通来我们学校进行校招宣讲,参加的人挺多的.一开始没打印成绩单,临时去打印的,然后排到我的时候以经快结束了 == 面试 首先当然是自我介绍啦,就巴拉巴拉了一堆自己的专业,学过什么跟职位相关的 ... 
