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
                        
                    [[email protected] test]# ./1.sh 3 5
                    aa
                    [[email protected] test]# echo $?
                    0
                    [[email protected] test]# ./1.sh 3 5
                    aa
                    [[email protected] 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
                   
                    [[email protected] test]# ./ifuser.sh user1
                    user1 Exists

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

#!/bin/bash
               sum=0
               for username in [email protected]
                    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

Shell脚本---条件判断

时间: 2025-01-17 08:04:58

Shell脚本---条件判断的相关文章

Linux Shell脚本条件判断

Shell条件判断 if list then           do something here elif list then do another thing here else do something else here fi  EX1: #!/bin/sh SYSTEM=`uname -s`    #获取操作系统类型,我本地是linux if [ $SYSTEM = "Linux" ] ; then     #如果是linux的话打印linux字符串 echo "

Linux | shell脚本-条件判断if和循环语句for

一.简介 上个章节中,我们学习了判断语句和运算语句.shell脚本中,这些判断语句一般都是和if.else.elif.for和while等语句一起使用. 在脚本编写中,条件判断语句常常用于多种情况的判断,符合哪一种情况就执行哪一种的命令. 二.shell条件判断语句:if 1.流程控制:if单分支结构 语法: if 条件判断:then 条件判断成功时执行的操作 ... fi 例子: 结合整数值比较-eq:检查主机是否在线 vim test1.sh运行结果:2.流程控制:if双分支结构 语法: i

Shell脚本条件判断

1.字符串判断 str1 = str2 当两个串有相同内容.长度时为真 str1 != str2 当串str1和str2不等时为真 -n str1 当串的长度大于0时为真(串非空) -z str1 当串的长度为0时为真(空串) str1    当串str1为非空时为真 2.数字的判断 int1 -eq int2 两数相等为真 int1 -ne int2 两数不等为真 int1 -gt int2 int1大于int2为真 int1 -ge int2 int1大于等于int2为真 int1 -lt

Linux | shell脚本-比较判断和运算语句

一.简介 在我们写shell脚本的过程中,经常需要作比较判断,例如比较哪个数字大,判断文件是否存在,判断文件是否是目录,判断是否为真等操作.有时候我们还需要做运行,例如加减乘除等等,今天就来简单介绍比较表达式和运行表达式. 二.shell比较判断 1.文件状态:表达式:[ -e 文件路径 ] 有空格隔开 例如:[ -e /root ] 判断/root 是否存在(1) -e 是否存在 存在为真(2) -d 是否是目录 是目录为真(3) -f 是否是文件 是文件 为真(4) -x 是否有执行权限 有

shell中条件判断if中的-z到-d的意思

shell中条件判断if中的-z到-d的意思 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真. [ -d FILE ] 如果 FILE 存在且是一个目录则为真. [ -e FILE ] 如果 FILE 存在则为真. [ -f FILE ] 如果 FILE 存在且是一个普通文件则为真. [ -g FILE ] 如果 FILE 存在且已经设置了SGID则

Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载

Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数,需要的朋友可以参考下 $#代表了命令行的参数数量,可以看以下实例: 复制代码 代码如下: if [ $# != 1 ] ; then echo "USAGE: $0 TABNAME" echo " e.g.: $0 CDR_CALL_20040701" exit 1; f

shell脚本真假判断(0为真,非0为假?或0为假,非0为真?)

在网络上,总有人说shell脚本的真假判断,有说0位真的,非0为假,但真的是这样吗? 做个实验,写个0的判断语句 执行结果是0 is true,那么我们想当然1是false了,做下测试: 然而执行的结果却大相径庭,0是ture,1也是ture 也就是说其他语言中(0为真,非0为假?或0为假,非0为真?)的理论均不成立. 那么linux是以什么来作为判断的呢 答案就是以命令执行后的状态,状态可用$?查看(echo $?显示0,表示执行成功,1表示执行失败) shell脚本真假判断(0为真,非0为假

shell中条件判断if中的-z到-d

shell中条件判断if中的-z到-d的意思 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真.[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真. [ -d FILE ] 如果 FILE 存在且是一个目录则为真. [ -e FILE ] 如果 FILE 存在则为真.[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真. [ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真

shell编程 条件判断式----利用 case ..... esac 判断

条件判断式----利用 case ..... esac 判断 case  $变量名称 in   <==关键词为 case ,还有变量前有钱字号 "第一个变量内容")   <==每个变量内容建议用双引号括起来,关键词则为小括号 ) 程序段 ;;            <==每个类别结尾使用两个连续的分号来处理! "第二个变量内容") 程序段 ;; *)                  <==最后一个变量内容都会用 * 来代表所有其它值 不包含