文章目录
- 一、条件语句
- 二、分支选择
- 三、循环语句
- 3.1 for循环
- 3.1.1 语法一
- 3.1.2 语法二
- 3.2 while循环
- 3.2.1 普通用法
- 3.2.2 while+if判断循环
- 3.2.3 特殊用法
- 3.3 until循环
- 四、break和continue
- 4.1 break用法
- 4.2 continue用法
- 五、自定义脚本退出状态码
一、条件语句
- 使用 if 语句做条件判断。
- 如下示例,判断学生成绩档次。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
read -p '请输入成绩:' num
if [ -z $num ];then
echo '输入错误'
exit
elif [ $num -ge 95 ];then
echo '优秀'
elif [ $num -ge 90 ];then
echo '较好'
elif [ $num -ge 80 ];then
echo '一般'
elif [ $num -ge 60 ];then
echo '及格'
else
echo ‘成绩不及格’
fi
二、分支选择
- case语句可以进行语句选择。
支持通配符 | 释义 |
---|---|
* | 任意长度任意字符 |
? | 任意单个字符 |
[] | 指字范围内的任意单个字符 |
abc | bcd |
1.如下示例,根据用户输入内容返回对应结果,常用于服务控制。
[root@localhost ~]# cat baimu.sh
#!/bin/bash
case $1 in
"name")
echo "你的名字是:李华"
;;
"age")
echo "你的年纪是:30岁"
;;
*) ##输入内容既不是name,也不是age,则使用星号。
echo "输入错误,请输入{name|age}"
;;
esac
2.服务控制,设置脚本启动httpd服务。
chkconfig:Centos7支持的参数。设置开机自动,关机停止。
- 第一个数表示运行级别。
- 第二个数表示系统开始后第几个启动。
- 第三个数表示系统关闭第几个关闭服务。
- 第二个数+第三个数=100
description:表示描述信息
#把脚本文件要入/etc/init.d/目录。
[root@mq init.d]# cat httpd
#!/bin/bash
# chkconfig: 35 40 60
# description: start httpd
case $1 in
"start")
/usr/local/httpd/bin/apachectl start
;;
"stop")
/usr/local/httpd/bin/apachectl stop
;;
"restart")
/usr/local/httpd/bin/apachectl stop
/usr/local/httpd/bin/apachectl start
;;
"status")
status=$(ps -ef|grep "httpd"|grep -Ev "grep|$0 status"|wc -l) ##grep -v表示取反过滤,-E扩展正则匹配grep或$0 status,wc -l 表示打印符合要求的文本数。
if [ $status -gt 0 ];then
echo "httpd is running"
else
echo "httpd is dead"
fi
;;
*)
echo "usage:start|stop|restart|status"
;;
esac
#将httpd添加到系统控制。
chkconfig --add httpd
三、循环语句
- 循环语句有三种,根据场景需要使用合适的循环语句。
- for循环:当列表不为空时进入循环,否则退出循环。
3.1 for循环
- 有三种写法,适用场景不一样。
- 提前知道循环次数时,适用for循环。
3.1.1 语法一
语法一,不需设置变量,常对列表内容进行循环,列表内容循环完毕就退出。
语法格式:
for 变量 in 列表; do 循环体 done
1.例一,循环自定义列表,不需要添加任何符号。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
for name in qingjun baimu zhangsan lisi;do
echo $name
done
2.例二,循环文件内容。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
for name in $(cat 99.txt);do
echo $name
done
3.例三,生成列表循环。2种生成方式:echo {1…10},或者seq [起始数] [步进长度] 结束数,比如seq 1 1 10。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
for age in $(seq 5);do
echo $age
done
3.1.2 语法二
- 语法二,C语言写法,需要设置初始值、退出条件、修正初始值的公式。
- 语法格式:
##写法一。 for ((expr1;expr2;expr3)) { 循环体 } ######################################### ##写法二。 for (( expr1 ; expr2 ; expr3 ));do 循环体 done ######################################### expr1:用于指定初始条件,给控制变量一个初始值。 expr2:判定什么时候退出循环。 expr3:修正expr1指定的变量的值。
1.例一,初始值为0,每次循环+1,当值大于10时则退出循环。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
for ((i=0;i<10;i++));do
echo $i
done
2.例二,初始值为20,每次循环-1,当值小于等于10时则退出循环。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
for ((i=20;i>10;i--))
{
echo $i
}
3.2 while循环
- while循环适用于循环次数未知的场景,需要有退出条件。
- 条件满足时进入循环,条件不满足则退出循环。条件编写格式和if语句一样。
语句格式:
while 条件; do 循环体 done
3.2.1 普通用法
1.例一,循环输出小于等于10的数值。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
age=0
while [ $age -lt 10 ];do
echo $age
let age++
done
3.2.2 while+if判断循环
1.配合if语句循环。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
age=0
while [ $age -lt 10 ];do
if [ $age -gt 4 ];then
echo "你今年:" $age岁
echo ———————————————————
fi
let age++
done
2.配合if语句控制循环。只循环age小于等于5的。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
age=0
state=true
while $state;do
let age++
if [ $age -le 5 ];then
echo "你今年:" $age岁
echo ——————————————————————————
else
state=false
fi
done
3.2.3 特殊用法
1.死循环。
##写法一。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
age=0
while :;do ##适用冒号代表真条件,永远循环。
echo $age
let age++
done
##写法二。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
i=0
while true;do #也可以写成true。
echo $i
let i++
done
2.先逐行读取已存在的文件内容,将读取的内容赋值给变量line,再进行操作循环。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
age=0
while read line;do ##read是固定写法。line为变量,其名称可以自定义。
echo $line
echo "你今年:$age岁"
let age++
done < qingjun1.txt
echo $age
3.3 until循环
- 条件不满足时进入循环,条件满足了退出循环,和while循环相反。
- 不常用。
1.条件成立退出循环,条件不成立才进入循环。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
age=0
until [ $age -ge 10 ];do
echo $age
let age+=2
done
四、break和continue
- break [num]:提前退出循环,后面的所有循环语句都不会执行,比较常用。
- continue [num]:提前结束本轮循环而进入下一轮循环。当循环语句执行到continue时,continue后面的语句将不再执行,提前进入下一轮循环。
4.1 break用法
- 当只有一层循环时,则直接终止后面所有循环;若有多层循环时,则后面跟的数值是从最里面的循环进行限制,而数值之外的循环正常执行。
- 如下示例,break 1表示对最里面的for循环进行限制,当if条件满足时则终止第2个for循环,会跳过直接进行下轮循环,此时第2个for循环虽终止,但第1个for循环还在正常执行,所以最后输出结果为:第1个for循环会循环完毕,会依次输出[1…10]数值,但第2个for循环每次执行到满足if条件时就会终止,也就是每次只会输出[1…8]数值。
- 若写成break 2 ,则表示从最里面的for循环数起,限制最里面和最里面往外的第2个for循环,但再往外的第3个…第5个…第n个for循环不会被限制。
1.设置break 1。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
for i in $( seq 10 );do
echo $i
for q in $( seq 5 );do
if [ $q -eq 2 ];then
break
fi
echo $q
done
done
2.设置break 2。此时会直接限制2个for循环,当q大于8时,则里面的for循环不再执行,外面一层的for循环也不执行。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
for i in $( seq 10 );do
echo $i
for q in $( seq 5 );do
if [ $q -eq 2 ];then
break 2
fi
echo $q
done
done
4.2 continue用法
- continue [num]:提前结束本轮循环而进入下一轮循环。当循环语句执行到continue时,continue后面的语句将不再执行,提前进入下一轮循环
1.当continue=1时。
2.当continue=2时。
[root@localhost ~]# cat qingjun.sh
#!/bin/bash
for i in $( seq 10 );do
echo $i
for q in $( seq 5 );do
if [ $q -eq 2 ];then
continue 2
fi
echo $q
done
done
五、自定义脚本退出状态码
- 常常适用echo $?查询上条命令的执行结果,返回0代表执行成功,其1-255数值说明执行失败。
- 查询脚本的执行情况时,是返回脚本最后一条命令的执行结果,若脚本中间有条命令执行失败,而最后一条命令执行成功,随后的echo $?也等于0。所以有时候我们是分不清echo $?返回的这个0是不是真的说明脚本执行的没问题,这时候就可以自定义退出状态码。
- 可以在脚本的最后一行定义一个exit 120,当我们echo $?时,返回的是120,说明脚本执行没问题,才可以执行下一步。
- 脚本中一旦遇到exit命令,脚本会立即终止。