shell编程之条件判断与流程控制

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编程更多考虑程序的功能实现,而不是效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值