条件判断与流程控制

一、流程控制语句
1、条件判断式
1)按照文件类型进行判断
According to the file type

两种判断格式

[root@localhost ~]# test -e /root/install.log
[root@localhost ~]# [ -e /root/install.log ]

简单的判断式

[root@localhost ~]# [ -d /root ] && echo "yest" || echo "no"
#第一个判断命令如果正确执行,则打印"yes",否则打印"no"

2)按照文件权限进行判断
According to the file permissions for judgment

[root@localhost ~]# [ -w student.txt] && echo "yes" || echo "no"
#判断文件是拥有写权限的

3)两个文件之间进行比较
Comparison between the two files

[root@localhost ~]# ln /root/student.txt /tmp/stu.txt
#创建硬链接
[root@localhost ~]# [ /root/student.txt -ef /tmp/stu.txt] && echo "yes" || echo "no"
#判断两个文件是否为同一个文件

4)两个整数之间的比较
The comparison between two integer

[root@localhost ~]# [ 23 -ge 22 ] && echo "yes" || echo "no"
#判断23是否大于等于22

[root@localhost ~]# [ 23 -le 22 ] && echo "yes" || echo "no"
#判断23是否小于等于22

5)字符串的判断
A string of judgment

[root@localhost ~]# name=fengj
@给name变量赋值
[root@localhost ~]# [ -z "$name" ] && echo "yes" || echo "no"
#判断name变量是否为空

[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和变量bb赋值
[root@localhost ~]# [ "$aa" == "bb" ] && echo "yes" || echo "no"
#判断两个变量的值是否相等

6)多重条件判断
Multiple conditions determine

[root@localhost ~]# aa=11
[root@localhost ~]# [ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"
#判断变量aa是否有值,同时判断变量aa的是否大于23
#因为变量aa的值不大于23,所以虽然第一个判断值为真,返回的结果也是假

2、单分支if语句
单分支if条件语句

if [ 条件判断式 ];then
   程序
fi
#或者
if [ 条件判断式 ]
   then
   程序
fi

单分支条件语句需要注意几个点
#if语句使用fi结尾,和一般语言使用大括号结尾不同
#[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
#then后面跟符合条件之后执行的程序,可以放在[]之后,用”;”分割。也可以换行写入,就不需要”;”了

例子1:判断登陆的用户是否为root

#!/bin/bash
test=$(env | grep "USER" | cut -d "=" -f 2)
if [ "$test" == root]
   then
   echo "Current user is root."
fi

例子2:判断分区使用率

#!/bin/bash
#统计根分区使用率

#把根分区使用率作为变量值赋予变量rate
rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f 1)

if [ $rate -ge 80 ]
then
    echo "Warning! /dev/sda3 is full!!"
fi

3、双分支if语句
双分支if条件语句

if [ 条件判断式 ]
then
    条件成立时,执行的程序
else
    条件不成立时,执行的另一个程序
fi

例子1:判断输入的是否是一个目录

#!/bin/bash
#判断输入的文件是否是一个目录
read -t 30 -p "Please input a directory: " dir

if [ -d $dir ]
then
    echo "yes"
else
    echo "no"
fi

例子2:判断apache是否启动

#!/bin/bash
#截取httpd进程,并把结果赋予变量test
test=$(ps aux | grep httpd | grep -v grep)
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-err.log
fi

4、多分支if语句
多分支if条件语句

if [ 条件判断式1 ]
   then
       当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
   then
       当条件判断式2成立时,执行程序2
...省略更多条件
else
       当所有条件都不成立时,最后执行此程序
fi

例子

#!/bin/bash
#字符界面加减乘除计算器

read -t 30 -p "Please input num1: " num1
read -t 30 -p "Please input num2: " num2
#通过read命令接收要计算的数值,并赋予变量num1和num2
read -t 30 -p "Please input a operator: " ope

if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
#第一层判断,用来判断num1,num2和ope中都有值
then
       test1=$(echo $num1 | sed 's/[0-9]//g')
       test2=$(echo $num2 | sed 's/[0-9]//g')
       #定义变量test1和test2的值为$(命令)的结果
       #后续命令作用是,把变量test1的值替换为空。如果能替换为空,证明num1的值为数字
       #如果不能替换为空,证明num1的值为非数字。我们使用这种方法判断变量num1的值为数字
       #用同样的方法测试test2变量

       if [ -z "$test1" -a -z "$test2" ]
          #第二层判断,用来判断num1和num2为数值
          #如果变量test1和test2的值为空,则证明num1和num2是数字
          then
          #如果test1和test2是数字,则执行以下命令
          if [ "$ope" == '+' }
             #第三层判断用来确认运算符
             #测试变量$ope中是什么运算符
             then
                sum=$(( $num1 + $num2))
                #如果是加号则执行加法运算
          elif [ "$ope" == '-' ]
             then
                 sum=$(($num1 - $num2))
                 #如果是减号,则执行减法运算
          elif [ "$ope" == '*' ]
             then
                 sum=$(( $num1 * $num2))
                 #如果是乘号,则执行乘法运算
          elif [ "$ope" == '/' ]
             then
                 sum=$(( $num1 / $num2))
                 #如果除号,则执行除法运算
          elif [ "$ope" == '%' ]
             then
                 sum=$(( $num1 % $num2))
                 #如果是取模,则执行取模运算
          else
             echo "Please enter a valid symbol"
             #如果运算符不匹配,提示输入有效的符号
             exit 10
             #并退出程序,返回错误代码10
          fi
       elif
           #如果test1和test2不为空,说明num1和num2不是数字
           echo "Please enter a valid value"
           #则提示输入有效的数值
           exit 11
           #并退出程序,返回错误代码11
       fi
elif
    echo "qing shuru neirong"
    exit 12
fi

echo " $num1 $ope $num2 : $num"
#输出数值运算的结果

例子:从1加到100

#!/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"

例子:批量添加指定数量的用户

#!/bin/bash
#批量添加指定数量的用户

read -p "Please input user name: " -t 30 name
read -p "Please input the number of users: " -t 30 num
read -p "Please input the password of users: " -t 30 pass
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass"]
then
   y=$(echo $num | sed 's/[0-9]//g')
   if [ -z "$y" ]
   then
     for(( i=1;i<=$num;i=i+1 )) do /usr/sbin/useradd $name$i &>/dev/null
         echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
       done
   fi
fi

5、case语句
多分支case条件语句
#case语句和if..elif..else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

case $变量名 in
    "值1")
      如果变量的值等于值1,则执行程序1
      ;;
    "值2")
      如果变量的值等于值2,则执行程序2
      ;;
    ...省略其他分支
    *)
      如果变量的值都不是以上的值,则执行此程序
      ;;
esac

6、for循环
语法一:

for 变量 in 值1 值2 值3 ...
  do
    程序
  done

例子:批量解压脚本

#!/bin/bash
#批量解压缩脚本

cd /root/test
ls *.tar.gz > /tmp/ls.log
for i in $(cat ls.log)
   do
     tar -zxf $i &>/dev/null
   done
rm -rf /tmp/ls.log

语法二

for (( 初始值;循环控制条件;变量变化 ))
   do
     程序
   done

7、while循环和until循环
1)while循环
while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才停止。这就和for的固定循环不太一样了。

while [ 条件判断式 ]
   do
      程序
   done

2)until循环
# until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环。

until [ 条件判断式 ]
  do 
    程序
  done

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据