Shell流程控制语句(if/for/while/until/case)

5.if语句

5.1 单分支结构

​ (条件表达式)部分可以是test、[]、[ [ ] ]、( ( ) )等条件表达式,甚至可以直接使用命令作为条件表达式。每个if条件语句都有if开头,并带有then,最后以fi结尾。相当于**[ 条件表达式 ] && 指令**

if (条件表达式)
    then
        指令
fiif (条件表达式); then                                #分号相当去换行命令
    指令
fi

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DanhV73R-1583994947312)(file:///C:/Users/YCY/AppData/Local/Temp/msohtmlclip1/02/clip_image001.png)]

5.2 if条件语句的嵌套

if (条件表达式)
    then
	if (条件表达式)
	    then
            指令
	fi
fi

5.3 if双分支结构

​ 相当于**[ 条件表达式 ] && 指令集1 || 指令集2**。

if (条件表达式)
    then
        指令集1
    else
		指令集2
fi

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tjuhYD7s-1583994947316)(file:///C:/Users/YCY/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)\

5.4 if多分支结构

​ 注:最后结尾的else后面没有then。

if (条件表达式1)
    then
        指令集1
elif (条件表达式2)
    then
	指令集2
……
else
	指令集3
fi


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VyDadD76-1583994947323)(file:///C:/Users/YCY/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg)]

[root@Centos7 ~]# cat grade.sh 
#!/bin/bash

read -p "Please input your score:" grade
if [[ $grade -lt 0 && $grade -gt 100 ]]
    then
	echo "invalid input!"
elif [[ $grade -ge 85 && $grade -le 100 ]]
    then
	echo "excellent"
elif [[ $grade -ge 75 && $grade -le 84 ]]
    then
	echo "well"
elif [[ $grade -ge 60 && $grade -le 74 ]]
    then
	echo "pass"
else
        echo "fail"
fi
[root@CentOS7 ~]# chmod +x grade.sh 
[root@CentOS7 ~]# ./grade.sh
Please input your score:85
excellent
[root@CentOS7 ~]# ./grade.sh
Please input your score:75
well
[root@CentOS7 ~]# ./grade.sh
Please input your score:60
pass
[root@CentOS7 ~]# ./grade.sh
Please input your score:54
fail

5.5 if条件语句多种条件表达式语法

5.5.1 test条件表达式

if test 表达式
    then
		指令
fi

**

5.5.2 []条件表达式

if [ 字符串或算术表达式 ]
    then
		指令
fi

5.5.3 [[]]条件表达式

if [[ 字符串表达式 ]]
    then
		指令
fi

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mJ90FwHI-1583994947324)(C:\Users\YCY\AppData\Roaming\Typora\typora-user-images\image-20200312141638894.png)]

5.5.4 ( ( ) )条件表达式

if ( ( 算术表达式 ) )
    then
		指令
fi

5.5.5 命令表达式

if 命令
    then
		指令
fi

6.循环语句

6.1 for循环

计算机生成了可选文字: 持续 循环, 直到 条件 表达 式不 满足 for循环开始 or循环条件表、大 真 do 命令集 done

6.1.1 列表循环

​ 列表for循环:用于将一组命令执行已知的次数

​ 在这种for循环语句语法中,for关键字后面会有一个“变量名”,变量名依次获取in关键字后面的变量取值列表内容(以空格分隔),每次仅取一个,然后进入循环(do和done之间的部分)执行循环内的所有指令,当执行到done时结束本次循环。之后,“变量名”再继续获取变量列表里的下一个变量值,继续执行循环内的所有指令,当执行到done时结束返回,以此类推,直到取完变量列表里的最后一个值并进入循环执行到done结束为止。

​ 此结构中“in 变量名列表”可以省略,省略时相当于in “ @ " , 也 就 是 说 f o r i 相 当 于 使 用 f o r i i n " @",也就是说for i相当于使用for i in " @"fori使foriin"@”。格式如下:

for 变量名 in 变量取值列表
do
	指令
donefor 变量名 in 变量取值列表; do
	指令
done
[root@Centos7 ~]# cat for1.sh 
#!/bin/bash

for var in {1..5}
do
	echo $var
done
#打印0-100所有偶数
[root@Centos7 ~]# cat for2.sh 
#!/bin/bash

for i in {0..100..2}
do
        echo $i
done

6.1.2 不带列表循环

​ 不带列表的for循环执行时由用户指定参数和参数的个数。格式为:

for 变量名; do
	指令
done
[root@Centos7 ~]# cat for3.sh 
#!/bin/bash

for i
do
        echo $i
done

6.1.3 C语言型for循环语句

​ for关键字后的双括号内是三个表达式,第一个是变量初始化,第二个为变量的范围,第三个为变量自增或自减。当第一个表达式的初始化值符合第二个变量的范围时,就进入循环执行;当条件不满足时就退出循环。格式为:

for((exp1; exp2; exp3)) 
do 
    指令
done
[root@Centos7 ~]# cat for4.sh 
for((i=1;i<=5;i++))
do
        echo $i
done

6.2 while循环

​ while循环语句会对紧跟在while命令后的条件表达式进行判断,如果该条件表达式成立,则执行while循环体里的命令或语句(即语法中do和done之间的指令),每一次执行到done时就会重新判断while条件表达式是否成立,直到条件表达式不成立时才会跳出while循环体。如果一开始条件表达式就不成立,那么程序就不会进入循环体(即语法中do和done之间的部分)中执行命令了。

while 条件表达式
do
    指令
done
[root@Centos7 ~]# i=1;while [ $i -le 5 ];do echo $i;let i++;done
1
2
3
4
5

6.3 until循环语句

​ until循环语句的用法与while循环语句的用法类似,区别是until会在条件表达式不成立时,进入循环执行指令;条件表达式成立时,终止循环。

until 条件表达式
do
    指令
done
[root@Centos7 ~]# i=1;until (($i > 5));do echo $i;let i++;done
1
2
3
4
5

6.4 循环嵌套

[root@Centos7 ~]# cat test.sh 
#!/bin/bash

for i in {1..5}
do
    for ((j=1;j<=$i;j++))
    do
	echo -n $j
    done
    echo ""
done

6.5 循环中断语句

​ break、continue在条件语句及循环语句(for、while、if等)中用于控制程序的走向;而exit则用于终止所有语句并退出当前脚本,除此之外,exit还可以返回上一次程序或命令的执行状态值给当前Shell;return类似于exit,只不过return仅用于在函数内部返回函数执行的状态值。

命令说明
break n如果省略n,则表示跳出整个循环,n表示跳出循环的层数
contiune n如果省略n,则表示跳过本次循环,忽略本次循环的剩余代码,进入循环的下一次循环。n表示对倒第n层继续循环
exit n退出当前shell程序,n为上一次程序执行的状态返回值,可以省略。可通过$?接受其退出值
return n用于在函数里作为函数的返回值,以判断函数执行是否正确。在下一个shell里可通格$?接受返回值
shift n使位置参数向左移动,默认移动一位
[root@Centos7 ~]# cat shift.sh 
#!/bin/bash

sum=0
while [ $# -ne 0 ]
do
    let sum=$sum+$1
    shift
done
echo sum=$sum

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XwxXBQQy-1583994947326)(C:\Users\YCY\AppData\Roaming\Typora\typora-user-images\image-20200312142722309.png)]

批量创建用户

[root@server1 ~]# vim create_user.sh 
#!/bin/bash

echo user{1..5}:y$[$RANDOM%10000+1]abc | tr ' ' '\n' > passwd.txt
for i in {1..5}
do
    user=`head -$i passwd.txt | tail -1 | cut -d: -f1`
    pass=`head -$i passwd.txt | tail -1 | cut -d: -f2`
    useradd $user
    echo $pass | passwd --stdin $user &>/dev/null
done
echo "success"

6.6 自定义Shell分隔符

​ 默认情况下,bash shell会以空格、制表符、换行符作为分隔符。通过IFS来自定义为分隔符。

​ 指定单个字符作为分隔符:IFS=: 以冒号做为分隔符,可以指定多个,如IFS=’\n:;’,这个赋值会将反斜杠、n、冒号、分号作为字段分隔符

注:$’\n’与’\n‘时的区别

IFS=’\n’,将字符\和字符n作为IFS的换行符

IFS=’$\n’,真正使用换行符作为字段分隔符

7.流程控制语句case

​ case控制语句用来对程序流程的选择、循环、转向和返回等进行控制。case是开关语句的一个组成部分,它是根据变量的不同进行取值比较,然后针对不同的取值分别执行不同的指令,相当于多分支的if/elif/else条件语句,常被应用于实现系统服务启动脚本等应用场景中。

​ 在case语句中,程序会将case获取的变量的值与表达式部分的值1、值2、值3等逐个进行比较,如果获取的变量值和某个值(例如值1)相匹配,就会执行值(例如值1)后面对应的指令(例如指令1,其可能是一组指令),直到执行到双分号(;;)才停止,然后再跳出case语句主体,执行case语句(即esac字符)后面的其他命令。

​ 如果没有找到匹配变量的任何值,则执行“*)”后面的指令(通常是给使用者的使用提示),直到遇到双分号(;;)(此处的双分号可以省略)或esac结束,这部分相当于if多分支语句中最后的else语句部分。另外,case语句中表达式对应值的部分,还可以使用管道等更多功能来匹配。

case "变量" in
       值1)
        指令1
           ;;
       值2)
        指令2
         ;;
    *)
        指令3   
esac

编写apache启动脚本

case $1 in
    start)
        systemctl $1 httpd &>/dev/null && echo "start successfully"
        ;;
    restart)
        systemctl $1 httpd &>/dev/null && echo "restart successfully"
        ;;
    stop)
        systemctl $1 httpd &>/dev/null && echo "stop successfully"
        ;;
    status)
        systemctl $1 httpd &>/dev/null && echo "view status"
        ;;
    *)
        echo "USAGE:$0 start|restart|stop|status"
        ;;
esac

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QJSkcHa6-1583995737162)(C:\Users\YCY\AppData\Roaming\Typora\typora-user-images\image-20200312144834124.png)]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值