shell编程之条件判断与流程控制
流程控制
shell的语法结构和绝大多数语言有所不同
建立编程思想
1)熟悉Linux基本命令、规范、语法及shell语法
2)当遇到实际需求时,活学活用
1、条件判断式语句
- 按照文件类型进行判断
两种判断格式
test -e /root/install.log
[ -e /root/install.log ] #推荐
[ -d kk ] && echo "yes" || echo "no"
#第一个判断命令如果正确执行,则打印"yes",否则打印"no"
- 按照文件权限进行判断
[ -r for.sh ] && echo yes || echo no
#第一个判断命令如果正确执行,则打印"yes",否则打印"no"
#注意按文件权限判断只要有该权限就会输出,不会区别所有者、所属组等
- 两个文件之间进行判断
- 两个整数之间比较
[ 23 -ge 22 ] && echo "yes" || echo no
- 字符串的判断
[ -z "ddd" ] && echo yes || echo no
[ "ssss" == "ssss" ] && echo yes || echo no
- 多重条件判断
2、单分支if语句
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
if语句使用fi结尾,和一般语言使用大括号结尾不同。
[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格。
then后面跟符合条件之后执行的程序,可以放在[]之后,用";"分割。也可以换行写入,就不需要";"了。
- 判断当前登录用户是否是root
#!/bin/bash
test=$(env | grep "USER" | cut -d "=" -f 2)
if [ "$test" == root ]
then
echo "Current user is root."
fi
- cut命令
cut:以某种方式按照文件的行进行分割
参数列表:
-b 按字节选取 忽略多字节字符边界,除非也指定了 -n 标志
-c 按字符选取
-d 自定义分隔符,默认为制表符。
-f 与-d一起使用,指定显示哪个区域。
- 判断分区使用率
#!/bin/bash
#统计根分区使用率
rate=$(df -h | grep "/dev/vda1" | awk '{print $5}' | cut -d "%" -f 1)
#把根分区使用率作为变量值赋予变量rate
if [ $rate -ge 80 ]
then
echo "Warning! /dev/vad1 is full!!"
fi
2、双分支if语句
if [ 条件判断式 ]
then
条件成立时,执行程序
else
条件不成立时,执行的另一个程序
fi
- 判断输入是否是一个目录
#!/bin/bash
read -t 30 -p "Please input a dir: " dir
if [ -d "$dir" ]
then
echo " < "$dir" > 我是一个目录!"
else
echo " < "$dir" > 我不是一个目录!"
fi
- 判断Apache服务是否启动
#!/bin/bash
test=$(ps aux | grep httpd | grep -v grep)
#截取httpd进程,并把结果集赋予变量test
if [ -n "$test" ]
#如果test的值不为空,则执行then命令
then
echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log
else
/etc/rc.d/init.d/httpd start
echo "$(date) restart httpd!" >> /tmp/autostart-err.log
fi
3、多分枝if条件语句
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
...省略更多条件...
else
当所有条件都不成立时,最后执行此程序
fi
- 计算器
#!/bin/bash
#该脚本是写一个简单的计算器
read -p "请输入第一个数字" x
read -p "请输入第二个数字" y
read -p "请输入运算符号" f
#最外层判断,判断输入的是否为空
# -n 判断 是否为非空
# -a 多重条件判断 与
if [ -n "$x" -a -n "$y" -a -n "$f" ]
then
#下面这个表达式用于判断输入的两个字符是否完全为数字,反引号 和 $()为同一个作用,将系统命令的值赋给变量,原理为,输出变量x的值,并利用管道符,将该值进行字符串替换, sed "s/旧字符串/新字符串/g",末尾g表示将指定范围内的所有旧字符串都替换,所以虽然[0-9]表示匹配一个字符,加了g以后,会替换所有字符。
test1=`echo "$x" | sed "s/[0-9]//g"`
test2=$(echo "$y" | sed "s/[0-9]//g")
#中间的判断,判断输入的两个值是否为数字
if [ -z "$test1" -a -z "$test2" ]
then
# 最内层判断,判断是什么运算符号
if [ "$f" == "+" ]
then
echo "$x和$y的和是"$[$x+$y]
elif [ "$f" == "-" ]
then
echo "$x和$y的差是"$[$x-$y]
elif [ "$f" == "*" ]
then
echo "$x和$y的积是"$[$x*$y]
elif [ "$f" == "/" ]
then
echo "$x和$y的商是"$[$x/$y]
fi
else
echo "您输入的不是数字,重新执行脚本"
bash jisuanqi.sh
exit 2
fi
else
echo "您没有输入数字,重新执行脚本"
bash jisuanqi.sh
exit 1
fi
4、多分支case条件语句
case语句和if...elif..else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
#/bin/bash
#判断用户输入
read -p "Please choose yes/no:" -t 30 cho
case $cho in
"yse")
echo "Your choose is yes!"
;;
"no")
echo "Your choose is no!"
;;
*)
echo "Your choose is error!"
;;
esac
5、for循环
- 语法一
for 变量 in 值1 值2 值3
do
程序
done
#!/bin/bash
for i in 1 2 3 4 5
do
echo $i
done
- 语法二
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
#!/bin/bash
#从1加到100
s=0
for (( i=1;i<=100;i=i+1 ))
do
s=$(( $s+$i ))
done
echo "The sum of 1+2+...+100 is: $s"
6、while循环和until循环
- while循环
while [ 条件判断式 ]
do
程序
done
#!/bin/bash
#从1加到100
i=1
s=0
while [ $i -le 100 ]
do
#变量值i小于等于100,执行循环
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is: $s"
- untill循环
until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。
一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。
until [ 条件判断式 ]
do
程序
done
##总结
shell主要用来简化管理员操作。
shell编程更多考虑程序的功能实现,而不是效率。