5.if语句
5.1 单分支结构
(条件表达式)部分可以是test、[]、[ [ ] ]、( ( ) )等条件表达式,甚至可以直接使用命令作为条件表达式。每个if条件语句都有if开头,并带有then,最后以fi结尾。相当于**[ 条件表达式 ] && 指令**
if (条件表达式)
then
指令
fi
或
if (条件表达式); then #分号相当去换行命令
指令
fi
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
[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
5.5.4 ( ( ) )条件表达式
if ( ( 算术表达式 ) )
then
指令
fi
5.5.5 命令表达式
if 命令
then
指令
fi
6.循环语句
6.1 for循环
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
指令
done
或
for 变量名 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