Shell脚本---条件判断

面向过程
     顺序执行
     选择执行:if;case
     循环执行:for;while;until   循环需有退出条件

选择执行(选择执行的前提,就是条件测试)
    
条件测试方式(测试条件)
     bash命令测试
          bash命令有命令执行状态返回值
          $?:用于上一条执行的命令状态返回值
          0:成功执行
          1-255:失败
          可以使用exit命令,在脚本中自定义脚本状态返回值,如果不定义,脚本的状态返回值取决于脚本执行结束前的最后一条语句的状态
               例子:
                 

   if [ $1 -lt $2 ]
                         then
                              echo "aa"
                              get=0
                         else
                              echo "bb"
                              get=9
                    fi
                         exit $get
                        
                    [root@localhost test]# ./1.sh 3 5
                    aa
                    [root@localhost test]# echo $?
                    0
                    [root@localhost test]# ./1.sh 3 5
                    aa
                    [root@localhost test]# echo $?
                    0


          ------------------------------------------------------
               可单独执行的命令,可不需要如下条件测试
     [ expression ]
     [[ expression ]]
     test expression
-----------------------------
脚本中要想完成条件判断,根据判断执行哪些语句,使用if判断
if 判断
          单分支if判断
               if 条件
                    then(条件满足)
                         语句
               fi
    
          多分支if判断
               if 条件
                    then(条件满足)
                         语句
                    else(条件不满足)
                         语句
               fi

练习:判断user1,user2是否存在,存在输出id和shell,不存在创建并输出其id

#!/bin/bash
file=/etc/passwd
for i in user1 user2
do
        id $i &> /dev/null
        if [ $? = 0 ]
           then
                grep "^$i" $file | awk -F: '{print $3,$7}'
           else
                useradd $i
                grep "^$i" $file | awk -F: '{print $3}'
        fi
done

嵌套:if判断中可以嵌套需要的其他判断如:for循环 if判断;for循环也可嵌套if判断
          for i in 列表
               do
                    if [ ]
                         then    
                              语句
                         else    
                              语句
                    fi
               done

          if [ $? - eq 0 ]
               then    
                    for i in 列表
                    do
                         语句
                    done
               else
                    for i in 列表
                    do
                         语句
                    done
          fi
----------------------------------------
脚本实现条件测试的时候,有三类测试:整数测试;字符测试;文件测试
          整数测试
               expression:数值1 比较符 数值2
                    $A 比较符 $B
                    大于 -gt: $A -gt $B
                    大于或等于:-ge
                    等于:-eq
                    小于:-lt
                    小于或等于:-le
                    不等于:-ne
    
     例子:随意两个整数,比较大小,输出大的数值
         

#!/bin/bash
          a=$RANDOM
          b=$RANDOM
               if [ $a -ge $b ]
                    then
                         echo -e "Max Number is A\nNumber:$a"
                    else
                         echo -e "Max Number is B\nNumber:$b"
               fi


              
     例子:判断某个的ID是系统用户还是普通用户
              

 #!/bin/bash
               UserName=user1
               if [ $(id -u $UserName) -gt 499 ]
                    then
                         echo "Common User:$UserName"
                    else
                         echo "Admin User or System User:$UserName"
               fi
              
       例子:判断user1;user2 UID和GID是否相同
               #!/bin/bash
         
          for i in user1 user2
               do
                    if [ $(id -u $i) -eq $(id -g $i) ]
                         then
                              echo "$i good guy"
                         else
                              echo "$i bad guy"
                    fi
               done


              

         
         
字符测试(比较两个字符串在ASCII表中的次序,从左到右逐字符比较,) 字符串需要加""
     >:大于
     <:小于
     ==:等于
     =~:判断左边的字符串是否能被右边的模式匹配;通常用于[[]]之中
          shell=/bin/bash    
          [[$shell =~ sh$ ]]
          echo $?  = 0
               一般做行首行尾锚定,模式不能加引号
          例子:查看CPU是什么品牌,最后输出品牌
         

#!/bin/bash
          cpu=$(cat /proc/cpuinfo | grep "vendor" | cut -d: -f2)
          if [[ $cpu =~ Intel$ ]];then
                    echo "cpu is Inter"
          else
                    echo "cpu is AMD"


          fi
     例子:传递一个参数给脚本,字符为memory或Memory,显示内存信息,否则显示/proc/uptime内容
    

 #!/bin/bash
if [[ $1 =~ [Mm]emory$ ]];then
     free -m
else
     cat /proc/uptime
fi



------------------------------------------
     单目比较
               -z $变量:字符串为空则为真,不空则为假
               -n $变量:为空则为假,不空则为真
                         例子:判断一个用户的Shell是否为bash,Shell为空直接退出'
                            

  #!/bin/bash
                              Shell=$(grep "^$1:" /etc/passwd | awk -F: '{print $7}')
                              if [ -z $Shell ]
                                   then
                                        echo "The user does not exist"
                                        exit 10
                              fi
                              if [ "$Shell" == "/bin/bash" ]
                                   then
                                        echo "$1 Shell is BashShell"
                                        Set=0
                                   else
                                        echo "$1 Shell Not BashShell"
                                        Set=9
                              fi
                              exit $Set


         
                             
文件测试
     测试符:文件路径
     -f :测试其是否为普通文件,即ls 文件类型为-的文件
     -d:测试其是否为目录文件
     -e:测试文件是否存在;存在为真,否则为假
     -r:测试使用者是否可读该文件
     -w:测试使用者是否可写该文件
     -x:测试使用者是否可执行该文件
     -s:测试该文件大小是否不空:不空则真,空则假
          例子:如/tmp/test目录不存在,就创建
               if [ ! -d /tmp/test ];then
                    mkdir /tmp/test
               fi
     短路操作(与优先级高于或) 前半段可以决定最终结果,后半段就不允许
          与运算
               真 && 真 = 真
               真 && 假 = 假
               假 && {真,假} = 假
          或运算
               假 || 真 = 真
               真 || 假  = 假
                    [-e /tmp/test ] || mkdir /tmp/test
                         如果前面为真,就不创建
                         如果前面为假,就创建
               ! id test &> /dev/null && useradd test || echo "用户以存在"
                  第一段用户不存在为真,创建用户
                  第一段段用户存在为假,后面的与就不会执行,然后前面结果为假,执行或运算
----------------------------------------------------------------    
bash 位置变量:把脚本后面的第一个值当作第一参数,赋予$1,依此类推
          $1,$2,$3,.....
               例子:判断用户是否存在
                   

 #!/bin/bash
                    UserName=$1
                    if id $UserName &> /dev/null
                         then
                              echo "$UserName Exists"
                         else
                              echo "$userName Not Exists"
                    fi
                   
                    [root@localhost test]# ./ifuser.sh user1
                    user1 Exists


                   
          $*,$@:所有的位置参数
          $#:位置参数的个数
          shift:实现位置参数轮替
         
          练习:通过参数传递给脚本一系列用户名,存在的跳过;不存在的添加
                  添加完成统计一共添加多少用户
              

#!/bin/bash
               sum=0
               for username in $@
                    do
                         if id $username &> /dev/null
                              then
                                   echo "User $username Exists"
                              else
                                   useradd $username &> /dev/null
                                   echo "$username" | passwd --stdin $username &> /dev/null
                                   echo -e "User $uesrname Add ok\nPasswd:$username\n"
                                   sum=$[$sum+1]
                         fi
                    done
               echo "Add $sum new users"


------------------------------------------------------------------
组合条件测试:
     -a:与
     -o:或
     !:非  单目操作符,放在条件前面
          a=3
          [ ! $a -eq 0 ]

例子:判断某个用户的UID是否大于1,小于等于499,需同时满足两个条件
#!/bin/bash
uid=$(grep "^bb.*bash$" /etc/passwd | cut -d: -f3)
if [ $uid -gt 500 -a $uid -le 600 ];then
       echo "user is system users"
fi

命令组合测试,仅用于命令测试
&&:与
||:或
!:非
    
例子:如果给定用户,如果其不存在就退出脚本
if ! id $1 &> /dev/null;then
     exit 6
fi
----------------------------------------
bash 条件判断之多分支if语句
语法格式
if 条件1;then
     语句
     elif 条件2;then
     语句
fi
列子:通过参数传递给脚本字符,如fedora,centos,就显示RedHat
       如suse,opensuse就显示SuSe,如ubuntu,mint,debian就显示Debian
       否则显示其他
 

    #!/bin/bash
if [ $1 = fedora -o $1 = centos ];then
     echo "RedHat"
elif [ $1 = suse -o $1 = opensuse ];then
     echo "SuSe"
elif [ $1 = ubuntu -o $1 = mint -o $1 = debian ];then
     echo "Debian"
else
     echo "Unknown"
fi




          


你可能感兴趣的:(if,条件判断)