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

shell编程之条件判断与流程控制
流程控制语句:
*条件判断式
*单分支if语句
*双分支if语句
*多分支if语句
*case语句
*for循环
*while循环和until循环
第一章 条件判断式语句
1.1概述:即该程序根据给定的条件来判断是否存在
1.2按文件类型判断
测试选项 作用
-d 文件     判断该文件是否存在,并且是否为目录文件(是目录为真)
-e 文件 判断该文件是否存在(存在为真)
-f 文件 判断该文件是否存在,并且是否为普通文件(是普通文件为真)
  **两种判断格式
*test -e 文件路径(或文件名)
*[ -e 文件路径(或文件名)]    推荐用这个
eg:[ -e /root/install.log ]
    echo $?

   [ -e /root/install.log ] && echo yes || echo no
1.3按文件权限判断
测试选项 作用
-r文件 判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)
-w文件 判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)
-x文件 判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
1.4两个文件之间的比较
测试选项 作用
文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新(如果新则为真)
文件1 -ot 文件2   判断文件1的修改时间是否比文件2的旧(如果旧则为真)
文件1 -ef 文件2 判断文件1与文件2的inode号是否一致,可以理解为两个文件是否一样。这个方法


是用于判断硬链接的最好方法
1.5两个整数之间的比较
测试选项 作用
整数1 -eq 整数2 判断整数1是否和整数2相等(相等为真)
整数1 -ne 整数2 判断整数1是否和整数2不相等(不相等为真)
整数1 -gt 整数2 判断整数1是否大于整数2(大于为真)
整数1 -lt 整数2 判断整数1是否小于整数2(小于为真)
整数1 -ge 整数2 判断整数1是否大于等于整数2(大于等于为真)
整数1 -le 整数2 判断整数1是否小于等于整数2(小于等于为真)
1.6字符串的判断
测试选项 作用
-z 字符串 判断字符串是否为空(为空返回真)
-n 字符串 判断字符串是否为非空(非空返回真)
字符串1 == 字符串2 判断字符串1是否和字符串2相等(相等返回真)
字符串1 != 字符串2 判断字符串1是否和字符串2不相等(不相等返回真)
1.7多重条件判断
测试选项 作用
判断1 -a 判断2 逻辑与,判断1和判断2都成立,最终的结果才为真
判断1 -o 判断2 逻辑或,判断1和判断2有一个成立,最终的结果就为真
!判断 逻辑非,使原始的判断式取反
第二章单分支if语句
2.1概述
Shell的语法结构和绝大多数语言有所不同
2.2单分支if语句
格式:
if [条件判断式];then
程序
fi
    或
if [条件判断式]
then
程序
fi
单分支条件语句需要注意几个点:
*if语句使用fi结尾,和一般语言使用大括号结尾不同
*[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
*then后面跟符号条件之后执行的程序,可以放在[]之后,用";"分割,也可以换行写入,就不需


要";"了
扩展:cut命令用法:
eg1:$ a=`echo root:x:0:0:root:/root:/bin/bash | cut -d : -f 1,5`
    $ echo $a
结果:root:root
上面的例子中,把 root:x:0:0:root:/root:/bin/bash 重定向到cut命令里,-d表示分隔


符,这里使用冒号: 作为分隔符,-f 表示字段,选择了第1,和第5个字段
eg2:$ a=`echo root:x:0:0:root:/root:/bin/bash | cut -d :  -f 1` 只打印第一个字段field 
   $ echo $a
结果:root
eg3:$ a=`echo root:x:0:0:root:/root:/bin/bash | cut -d : -f 1-` 打印第一个字段以后的所


有字段,包含第一个字段
   $ echo $a
结果:root:x:0:0:root:/root:/bin/bash 
eg4:$ a=`echo root:x:0:0:root:/root:/bin/bash | cut -d : -f 2-4` 截取第2到第4个字段
           $ echo $a
结果:x:0:0 
eg5:$ a=`echo root:x:0:0:root:/root:/bin/bash | cut -c 2-5 `
   $ echo $a
结果:oot:
eg6:$ a=`echo root:x:0:0:root:/root:/bin/bash | cut -c -2 `   // 截取前两个字符  
   $ echo $a
结果:ro
eg:判断登陆用户是否是shiyanlou
#!/bin/bash          #注释是Bash脚本
test=$(env | grep "USER" | cut -d "=" -f 2)    #定义一个变量并给其赋值
if [ "$test" == "shiyanlou" ]       #条件判断表达式之按字符串的判断
then       #Shell中if语句的固定结构
echo "dangqian yonghu is shiyanlou" #程序
fi       #Shell中if语句的固定结构
2.3例:判断分区使用率
#!/bin/bash
#统计根分区使用率
test=$(df -h | grep /dev/xvdb1 | awk '{print $5}' | cut -d "%" -f 1) 
#把根分区使用率作为变量值赋予变量test
if [ "$test" -ge "50" ]
then
echo "/ is full"
fi
第三章双分支if语句
3.1例:判断输入的是否是一个目录
格式:
if [ 条件表达式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
eg:判断输入的是否是一个目录
#!/bin/bash
#read命令用于读取键盘输入的数据
read -t 30 -p "please input a dir:" dir
#双分支if语句结构
if [  -d "$dir" ]
then
echo "he is a dir"
else
echo "he is a file"
fi
扩展:read命令的用法
read命令接收标准输入(键盘)的输入,或者其他文件描述符的输入。得到输入后,read命令将数据放入一


个标准变量中。
eg:read  name                           #从键盘输入
eg:read -p "Enter your name:" name       #-p参数,允许在read命令行中直接指定一个提示
eg:read -t 5 -p "please enter your name:" name  #使用read命令存在着潜在危险。脚本很可能会停下


来一直等待用户的输入。如果无论是否输入数据脚本都必须继续执行,那么可以使用 -t 选项指定一个计时器,指定read命令


等待输入的秒数。当计时满时,read命令返回非零值(0为正常退出状态); 
具体其它用法参考百度

3.2判断Apache服务是否启动

**扩展:一个网站正常的部分有:美工  程序  运维  Apache(要想程序可以运行必须通过它或类似的)  Linux(服务器) 域名  IP   带宽

程序部署到Apache上,才能执行,而且Apache要放到Linux系统中,所以一个网站不能瘫痪,就必须保证其Apache服务一直是启动状态。

那如何保证呢?我们可以写一个shell脚本,假如其Apache服务卡了那我们可以设置重新启动

ps aux :查看Linux系统中正在运行的所有进程。相当于Windows系统中的任务管理器

ps aux | grep httpd | grep -v grep :查看Apache服务是否启动  (当然前提是其Linux系统中是否安装了Apache)

service httpd start : 启动Apache服务

service httpd stop:停止Apache服务

     eg:shell脚本中编写程序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 & > /dev/null
echo "$(date) restart httpd !" >> /tmp/autostart-acc.log
fi

     问题:我们写了这个脚本,假如我们Apache服务卡了,那我们没有执行这个脚本文件,也是没用啊???怎么让这个脚本随时再执行呢???(注意:我们这个脚本文件命名不能带有httpd的名字,不然该文件程序会失效)

第四章多分支if语句
4.1简介
格式:
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
...省略更多条件...
else
当所有条件都不成立时,最后执行此程序
fi
4.2例:计算器???
#!/bin/bash
read -t 30 -p "please input num1:" num1
read -t 30 -p "please input num2:" num2
read -t 30 -p "please input operator:" op
if [ -n "$num1" -a -n "$num2" -a -n "$op" ]
then
test1=$(echo $num1 | sed 's/[0-9]//g')  ???
test2=$(echo $num2 | sed 's/[0-9]//g')  ???
if [ -z "$test1" -a -z "$test2" ]
then
if [ "$op" == "+" ]
then
res=$(($num1+$num2))
elif [ "$op" == "-" ]
then
res=$(($num1-$num2))
elif [ "$op" == "*" ]
then
res=$(($num1*$num2))
elif [ "$op" == "/" ]
then
res=$(($num1/$num2))
else
echo "operator input error"
exit 10  ???
fi
else
echo "num input error"
exit 11
fi
else
echo "please input content"
exit 12
fi
echo "$num1$op$num2=$res"
4.3例:判断用户输入的是什么文件
#!/bin/bash
read -t 30 -p "please input a filename:" file
if [ -z "$file" ]
then
echo "please input a filename"
exit 11   ???
  elif [ ! -e "$file" ]
then
echo "$file not is a file"
exit 12
  elif [ -f "$file" ]
then
echo "$file is a putong file"
  elif [ -d "$file" ]
then
echo "$file is a dir"
  else
echo "$file is a other file" 
fi
第五章多分支case语句
5.1多分支case语句
*case语句和if...elif...else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句


只能判断一种条件关系,而if语句可以判断多种条件关系。
*格式:
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)
如果变量的值都不是以上的值,则执行此程序
       ;;
esac
eg:
#!/bin/bash
read -t 30 -p "please choose:" cho
case $cho in
"yes")
echo "you are choose yes"
;;
"no")
echo "you are choose no"
;;
*)
echo "you are choose error"
;;

esac

第六章for循环
6.1for循环
语法格式一:
for 变量 in 值1 值2 值3...
   do
程序
   done
eg1:#!/bin/bash
   for i in 1 2 3 4 5
do 
echo $i
done
eg2:批量解压缩脚本
$ cd ~
$ mkdir test(假如test文件夹中有若干个tar.gz压缩文件,那我们用一般方法解压就很麻烦)
$ vi a2.sh
#!/bin/bash
cd /home/shiyanlou/test/
ls *.tar.gz > ls.log       #将所有的tar.gz压缩文件覆盖到ls.log文件中
#echo $(cat ls.log)  
for i in $(cat ls.log)     #利用for循环依次解压tar.gz文件
do
tar -zxvf $i
done
语法格式二:
for((初始值;循环控制条件;变量变化))
do
程序
done
eg:for(i=0;i<2;i++)
do
echo $i
done
6.2例:批量添加删除指定数量的用户 ???
#!/bin/bash
#批量添加指定数量的用户
read -t 30 -p "please input adduser name:" name
read -t 30 -p "please input adduser count:" num
read -t 30 -p "please input adduser password:" password
if [ -z "$name" -a ! -z "$num" -a ! -z "password" ]
then
y=$(echo $num | sed 's/[0-9]//g')
if [ -z "$y" ]
then
for((i=1;i<=$num;i++))
do
/usr/sbin/useradd $name$i & > /dev/null
echo $password | /usr/bin/passwd --stdin $name$i & > /dev/null
done
fi
fi
第七章while循环和until循环
7.1while循环和until循环
*while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这


就和for的固定循环不太一样了。
*语法格式:
while [ 条件判断式 ]
do
程序
done
*eg:
#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
sum=$(($sum+$i))
i=$(($i+1))   
done
ehco $sum
*until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循


环。
*语法格式:
until [ 条件判断式 ]
do
程序
done
eg:
#!/bin/bash
i=1
sum=0
until [ $i -gt 100 ]
do
sum=$(($sum+$i))
i=$(($i+1))   
done
ehco $sum




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值