• shell条件判断与流程控制


    • 一  条件判断式语句

    1.按文件类型进行判断

    测试类型 作用
    -b 文件 判断文件是否存在,并且是否为块设备文件(是块设备文件为真)
    -c 文件 判断文件是否存在,并且是否为字符设备文件(是字符设备设备文件为真)
    -d 文件 判断文件是否存在,并且是否为目录文件(是目录文件为真)
    -e 文件 判断文件是否存在,(存在为真)
    -f 文件 判断文件是否存在,并且是否为普通文件(是普通文件为真)
    -L 文件 判断文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
    -p 文件 判断文件是否存在,并且是否为管道文件(是管道文件为真)
    -s 文件 判断文件是否存在,并且是否为非空(非空为真)
    -S 文件 判断文件是否存在,并且是否为套接字文件(是套接字文件为真)

     两种判断格式

    • test -e /root/install.log
    • [ -e /root/install.log ]  
     1 [root@MacBook-Pro ~]# test -e /etc/passwd
     2 [root@MacBook-Pro ~]# [ -e /etc/passwd ]
     3 [root@MacBook-Pro ~]# echo $?
     4 0
     5 [root@MacBook-Pro ~]# test -e /etc/passwd
     6 [root@MacBook-Pro ~]# echo $?
     7 0
     8 [root@MacBook-Pro ~]# [ -e /etc/passwdhsdfkjashdf ]
     9 [root@MacBook-Pro ~]# echo $?
    10 1
    11 [root@MacBook-Pro ~]# [ -d /root ] && echo "yes" || echo "no"
    12 yes
    13 [root@MacBook-Pro ~]# 

    2.按照文件权限进行判断

    测试选项 作用
    -r 文件 判断该文件是否存在,并且该文件是否拥有读权限 (有读权限为真)
    -w 文件 判断该文件是否存在,并且该文件是否拥有写权限 (有写权限为真)
    -x 文件 判断该文件是否存在,并且该文件是否拥有执行权限 (有执行权限为真)
    -u 文件 判断该文件是否存在,并且该文件是否拥有SUID权限 (有SUID权限为真)
    -g 文件 判断该文件是否存在,并且该文件是否拥有SGID权限 (有SGID权限为真)
    -k 文件 判断该文件是否存在,并且该文件是否拥有SBit权限 (有SBit权限为真)
     1 [ucm@MacBook-Pro testpace]$ ll
     2 总用量 4
     3 -rw-r--r--. 1 ucm ucm 61 12月 31 16:41 stu.log
     4 [ucm@MacBook-Pro testpace]$ [-w stu.log] && echo yes || echo no
     5 bash: [-w: 未找到命令...
     6 no
    #注意 :[] 括号中的判断式必须有空格
     8 [ucm@MacBook-Pro testpace]$ [ -w stu.log ] && echo yes || echo no
     9 yes
    10 [ucm@MacBook-Pro testpace]$ 
    #该例子中该文件的权限只要有写权限,就判断为真,不管是其拥有者权限,还是所属组的权限。---------即:不能判断指定的权限。

    3.两个文件之间进行比较

    测试选项 作用
    文件1 -nt 文件2 判断文件1的修改时间是否比文件2新 (如果新,则为真)
    文件1 -ot 文件2 判断文件1的修改时间是否比文件2旧 (如果旧,则为真)
    文件1 -ef 文件2 判断文件1与文件2的Inode号是否一致;可以理解为两个文件是否为同一个文件。用于判断是否是硬连接
     1 [ucm@MacBook-Pro testpace]$ ll
     2 总用量 4
     3 -rw-r--r--. 1 ucm ucm 61 12月 31 16:41 stu.log
     4 [ucm@MacBook-Pro testpace]$ pwd
     5 /home/ucm/testpace
     6 [ucm@MacBook-Pro testpace]$ ln /home/ucm/testpace/stu.log /tmp/pace/stu.txt
     7 ln: 无法创建硬链接"/tmp/pace/stu.txt" => "/home/ucm/testpace/stu.log": 没有那个文件或目录
     8 [ucm@MacBook-Pro testpace]$ ln /home/ucm/testpace/stu.log /tmp/stu.txt
     9 [ucm@MacBook-Pro testpace]$ ll
    10 总用量 4
    11 -rw-r--r--. 2 ucm ucm 61 12月 31 16:41 stu.log
    12 [ucm@MacBook-Pro testpace]$ cd /tmp/
    13 [ucm@MacBook-Pro tmp]$ ll
    14 总用量 ***
    15 -rw-r--r--. 2 ucm  ucm      61 12月 31 16:41 stu.txt
    16 [ucm@MacBook-Pro tmp]$ [ /home/ucm/testpace/stu.log -ef /tmp/stu.txt ] && echo yes || echo no
    17 yes
    18 [ucm@MacBook-Pro tmp]$ 

    4.两个整数之间的比较

    测试选项 作用
    整数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 JideMacBook-Pro:testpace jixiaodong$ [ 23 -ge 22 ] && echo yes || echo no
    2 yes
    3 JideMacBook-Pro:testpace jixiaodong$ [ 23 -le 22 ] && echo yes || echo no
    4 no
    5 JideMacBook-Pro:testpace jixiaodong$ 

    5.字符串的判断

    测试选项 作用
    -z 字符串 判断字符串是否为空 (为空返回真)
    -n 字符串 判断字符串是否非空 (非空返回真)
    字符串1 == 字符串2 判断字符串1是否与字符串2相等 (相等返回真)
    字符串 != 字符串2 判断字符串1是否与字符串2不相等 (不相等返回真)
    1 [ucm@MacBook-Pro ~]$ name=echohello
    2 [ucm@MacBook-Pro ~]$ [ -z "$name" ] && echo yes || echo no
    3 no
    4 [ucm@MacBook-Pro ~]$ [ -n "$name" ] && echo yes || echo no
    5 yes
    6 [ucm@MacBook-Pro ~]$ 
     1 [ucm@MacBook-Pro ~]$ aa=11
     2 [ucm@MacBook-Pro ~]$ bb=22
    此处是判断的字符串相等,如果需要判断数值相等,则需要使用 -ep
    3 [ucm@MacBook-Pro ~]$ [ $aa==$bb ] && echo yes || echo no 4 yes 5 [ucm@MacBook-Pro ~]$ echo $AA 6 7 [ucm@MacBook-Pro ~]$ echo $aa 8 11 9 [ucm@MacBook-Pro ~]$ echo $bb 10 22 11 [ucm@MacBook-Pro ~]$ [ "$aa"=="$bb" ] && echo yes || echo no 12 yes
    ==号左右需要有空格!!!
    13 [ucm@MacBook-Pro ~]$ [ "$aa" == "$bb" ] && echo yes || echo no 14 no 15 [ucm@MacBook-Pro ~]$

    6.多重条件判断

    测试选项 作用
    判断式1 -a 判断式2 逻辑与
    判断式1 -o 判断式2 逻辑或
    ! 判断 逻辑非
    1 [ucm@MacBook-Pro ~]$ echo $aa
    2 11
    3 [ucm@MacBook-Pro ~]$ echo $bb
    4 22
    5 [ucm@MacBook-Pro ~]$ [ -n "$aa" -a "$aa" -gt "$bb" ] && echo yes || echo no
    6 no
    7 [ucm@MacBook-Pro ~]$ 

    二  单分支if语句

    if [ 条件判断式 ] ;then

      程序

    fi

    或者:

    if [ 条件判断式 ]

      then

      程序

    fi

     1 [ucm@MacBook-Pro testpace]$ cat user.sh 
     2 #!/bin/bash
     3 
     4 test=$(env | grep "USER" | cut -d "=" -f 2)
     5 
     6 if [ "$test" == ucm ]
     7     then
     8     echo "now user is $test"
     9 fi
    10 [ucm@MacBook-Pro testpace]$ ./user.sh 
    11 now user is ucm
    12 [ucm@MacBook-Pro testpace]$ 
     1 [ucm@MacBook-Pro testpace]$ cat df.sh 
     2 #!/bin/bash
     3 
     4 source=$(df -h | grep "/cl-root" | awk '{print $5}' | cut -f 1 -d "%")
     5 
     6 if [ $source -gt 75 ]
     7     then
     8     echo "this is full"
     9 fi
    10 [ucm@MacBook-Pro testpace]$ ./df.sh 
    11 this is full
    12 [ucm@MacBook-Pro testpace]$ 

    三  双分支条件语句

    if [ 条件判断式 ]

      then

        条件成立时,执行

      else

        条件不成立时,执行

    fi

     1 [ucm@MacBook-Pro testpace]$ ll
     2 总用量 20
     3 -rw-rw-r--. 1 ucm ucm   0 1月   1 15:08 =0
     4 -rwxr-xr-x. 1 ucm ucm 137 1月   1 15:16 df.sh
     5 -rwxr-xr-x. 1 ucm ucm 134 1月   1 15:40 dir.sh
     6 -rwxr-xr-x. 1 ucm ucm  68 1月   1 15:21 echo.sh
     7 -rw-r--r--. 2 ucm ucm  61 12月 31 16:41 stu.log
     8 -rwxr-xr-x. 1 ucm ucm 115 1月   1 14:23 user.sh
     9 [ucm@MacBook-Pro testpace]$ pwd
    10 /home/ucm/testpace
    11 [ucm@MacBook-Pro testpace]$ ./dir.sh 
    12 please input a dir: /home/ucm
    13 this is dir
    14 [ucm@MacBook-Pro testpace]$ ./dir.sh 
    15 please input a dir: /home/ucm/testpace/stu.log
    16 this is not dir
    17 [ucm@MacBook-Pro testpace]$ cat dir.sh 
    18 #!/bin/bash
    19 
    20 read -t 30 -p "please input a dir: " dir
    21 
    22 if [ -d "$dir" ]
    23     then
    24         echo "this is dir"
    25 
    26     else
    27         echo "this is not dir"
    28 fi
    29 [ucm@MacBook-Pro testpace]$ 
     1 [ucm@MacBook-Pro testpace]$ cat apache.sh 
     2 #!/bin/bash
     3 
     4 apache=$(ps -aux | grep httpd | grep -v "grep")
     5 
     6 if [ -n "$apache" ]
     7     then
     8         echo "$(date) httpd is ok !" >> /tmp/apache.log
     9     else
    10         service httpd start
    # 此处写成service httpd start,并不稳妥,我的linux的/etc/rc.d/init.d/中没有找到httpd文件。
    11 echo "$(date) restart httpd !" >> /tmp/apache.log 12 fi 13 [ucm@MacBook-Pro testpace]$

    四  多分支if语句

    if [ 条件判断式1 ]

      then

        条件判断式1成立时,执行程序1

    elif [ 条件判断式2 ]

      then

        条件判断式2成立时,执行程序2

    ····

    else

      当所有条件判断式都不成立时,执行此程序

    fi

    举个例子:计算器

     1 [ucm@MacBook-Pro testpace]$ cat calc.sh 
     2 #!/bin/bash
     3 
     4 read -t 30 -p "请输入第一个数字:" num1
     5 read -t 30 -p "请输入第二个数字:" num2
     6 #通过read命令接收用户输入,并存储到变量num1/num2中
     7 read -t 30 -p "请输入运算类型【+-*/】:" ope
     8 #通过read命令接收计算的类型
     9 
    10 if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
    11     then
    12         test1=$(echo $num1 | sed 's/[0-9]//g')
    13         test2=$(echo $num2 | sed 's/[0-9]//g')
    14         if [ -z "$test1" -a -z "$test2" ]
    15             then    
    16                 if [ "$ope" == "+" ]
    17                     then
    18                         result=$(( $num1 + $num2 ))
    19                 elif [ "$ope" == '-' ]
    20                     then
    21                         result=$(( $num1 - $num2 ))
    22                 elif [ "$ope" == '*' ]
    23                     then
    24                         result=$(( $num1 * $num2 ))
    25                 elif [ "$ope" == '/' ]
    26                     then
    27                         if [ "$num2" != '0' ]
    28                             then
    29                                 result=$(( $num1 / $num2 ))
    30                         else    
    31                             echo "分母不可为0"
    32                             exit 11
    33                         fi
    34                 else
    35                     echo "请输入正确的运算符"
    36                     exit 10
    37                 fi
    38         else
    39             echo "请输入数字"
    40             exit 12
    41         fi    
    42 else
    43     echo "请输入数值与运算类型"
    44     exit 13
    45 fi
    46 
    47 echo "$num1 $ope $num2: $result"
    48 [ucm@MacBook-Pro testpace]$ ./calc.sh 
    49 请输入第一个数字:11
    50 请输入第二个数字:22
    51 请输入运算类型【+-*/】:+
    52 11 + 22: 33
    53 [ucm@MacBook-Pro testpace]$ ./calc.sh 
    54 请输入第一个数字:11
    55 请输入第二个数字:9
    56 请输入运算类型【+-*/】:-
    57 11 - 9: 2
    58 [ucm@MacBook-Pro testpace]$ ./calc.sh 
    59 请输入第一个数字:11
    60 请输入第二个数字:5
    61 请输入运算类型【+-*/】:*
    62 11 * 5: 55
    63 [ucm@MacBook-Pro testpace]$ ./calc.sh 
    64 请输入第一个数字:60
    65 请输入第二个数字:12
    66 请输入运算类型【+-*/】:/
    67 60 / 12: 5
    68 [ucm@MacBook-Pro testpace]$ ./calc.sh 
    69 请输入第一个数字:99
    70 请输入第二个数字:0
    71 请输入运算类型【+-*/】:/
    72 分母不可为0
    73 [ucm@MacBook-Pro testpace]$ ./calc.sh 
    74 请输入第一个数字:99
    75 请输入第二个数字:2
    76 请输入运算类型【+-*/】:/
    77 99 / 2: 49
    78 [ucm@MacBook-Pro testpace]$ ./calc.sh 
    79 请输入第一个数字:99
    80 请输入第二个数字:0
    81 请输入运算类型【+-*/】:*
    82 99 * 0: 0
    83 [ucm@MacBook-Pro testpace]$ 
    View Code

     举个例子:判断输入的文件类型

     1 [ucm@MacBook-Pro testpace]$ cat file.sh 
     2 #!/bin/bash
     3 
     4 read -t 30 -p "please input filename : " file
     5 
     6 if [ -z "$file" ]
     7     then
     8         echo "必须输入信息"
     9         exit 11
    10 elif [ ! -e "$file" ]
    11     then
    12         echo "请输入文件名"
    13         exit 12
    14 elif [ -f "$file" ]
    15     then
    16         echo "$file 是一个普通文件"
    17 elif [ -d "$file" ]
    18     then
    19         echo "$file 是一个目录文件"
    20 else
    21     echo "$file 是其他类型文件"
    22 
    23 
    24 fi 
    25 [ucm@MacBook-Pro testpace]$ ./file.sh 
    26 please input filename : 
    27 必须输入信息
    28 [ucm@MacBook-Pro testpace]$ ./file.sh 
    29 please input filename : /home/ucm
    30 /home/ucm 是一个目录文件
    31 [ucm@MacBook-Pro testpace]$ ./file.sh 
    32 please input filename : /home/ucm/testpace/file.sh
    33 /home/ucm/testpace/file.sh 是一个普通文件
    34 [ucm@MacBook-Pro testpace]$ ./file.sh 
    35 please input filename : dfadasf
    36 请输入文件名
    37 [ucm@MacBook-Pro testpace]
    View Code

    五  多分支case语句

    case $变量名 in

      "值1")

        如果变量值等于值1,则执行程序1

        ;;

      “值2”)

        如果变量值等于值2,则执行程序2

        ;;

    ---省略其他条件分支---

      *)

        如果变量值不是以上的值,则执行此程序

      ;;

    esac

    举个例子:选项

     1 [ucm@MacBook-Pro testpace]$ ./case1.sh 
     2 consumer choose 1
     3 cbg choose 2
     4 ebg choose 3
     5 请输入你的选择代号:3
     6 your choose egb
     7 [ucm@MacBook-Pro testpace]$ ./case1.sh 
     8 consumer choose 1
     9 cbg choose 2
    10 ebg choose 3
    11 请输入你的选择代号:1
    12 your choose consumer
    13 [ucm@MacBook-Pro testpace]$ ./case1.sh 
    14 consumer choose 1
    15 cbg choose 2
    16 ebg choose 3
    17 请输入你的选择代号:2
    18 your choose cbg
    19 [ucm@MacBook-Pro testpace]$ ./case1.sh 
    20 consumer choose 1
    21 cbg choose 2
    22 ebg choose 3
    23 请输入你的选择代号:6
    24 请输入正确的选择!
    25 [ucm@MacBook-Pro testpace]$ cat case1.sh 
    26 #!/bin/bash
    27 
    28 echo "consumer choose 1"
    29 echo "cbg choose 2"
    30 echo "ebg choose 3"
    31 
    32 read -t 30 -p "请输入你的选择代号:" cho
    33 
    34 case $cho in
    35     "1")
    36         echo "your choose consumer"
    37         ;;
    38     "2")    
    39         echo "your choose cbg"
    40         ;;
    41     "3")
    42         echo "your choose egb"
    43         ;;
    44     *)
    45         echo "请输入正确的选择!"
    46         ;;
    47 esac
    48 [ucm@MacBook-Pro testpace]$ 
    View Code

    六  for循环

      语法一

    for 变量 in 值1 值2 值3 值4 ····

      do

        程序

      done

    eg:

     1 [ucm@MacBook-Pro testpace]$ cat for.sh 
     2 #!/bin/bash
     3 
     4 for i in 1 2 3 4 5
     5     do
     6         echo $i
     7     done
     8 
     9 [ucm@MacBook-Pro testpace]$ ./for.sh 
    10 1
    11 2
    12 3
    13 4
    14 5
    15 [ucm@MacBook-Pro testpace]$ 
     1 [ucm@MacBook-Pro testpace]$ cat untar-gz.sh 
     2 #!/bin/bash
     3 #批量解压缩脚本
     4 
     5 cd /home/ucm/testpace
     6 ls *.tar.gz > ls.log
     7 for i in $(cat ls.log)
     8     do
     9         tar -zxvf $i &>/dev/null
    10     done
    11 rm -rf /home/ucm/testpace/ls.log
    12 [ucm@MacBook-Pro testpace]$ 

    上方脚本中tar -zxvf $i &>/dev/null 可以写成tar -zxf $i &>/dev/null 因为在脚本中执行,用户不需要查看输出,所以可以省略v,详细信息不作输出。

      语法二

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

      do

        程序

      done

     1 [ucm@MacBook-Pro testpace]$ cat add.sh 
     2 #!/bin/bash
     3 
     4 #从1加到100
     5     
     6 s=0
     7 for((i=1;i<=100;i++))
     8     do
     9         s=$(( $s + $i ))
    10     done
    11 echo "The sum of 1+2+~~~+99+100 is $s"
    12 [ucm@MacBook-Pro testpace]$ ./add.sh 
    13 The sum of 1+2+~~~+99+100 is 5050
    14 [ucm@MacBook-Pro testpace]$ 
     1 [ucm@MacBook-Pro testpace]$ cat useradd.sh 
     2 #!/bin/bash
     3 #批量添加指定数量的用户
     4 
     5 read -p "Please input user name : " -t 30 name
     6 read -t 30 -p "Please input the number of users : " num
     7 read -t 30 -p "Please input the passwd of user : " pass
     8 
     9 if [ -n "$name" -a -n "num" -a -n "$pass" ]
    10     then
    11         y=$( echo $num | sed 's/[0-9]//g')
    12         if [ -z "$y" ]
    13             then
    14                 for(( i=1;i<=$num;i++ ))
    15                     do
    16                         /usr/sbin/useradd $name$i &>/dev/null
    17 #用/usr/bin/passwd --stdin接收$pass的信息,给每个用户赋予初始密码
    18                         echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
    19                     done
    20         else
    21             echo "请输入正整数"
    22             exit 11
    23         fi
    24 else
    25     echo "input info is null !!!"
    26     exit 10
    27 fi
    28 [ucm@MacBook-Pro testpace]$ sudo ./useradd.sh 
    29 Please input user name : useraa
    30 Please input the number of users : 3
    31 Please input the passwd of user : 123456
    32 [ucm@MacBook-Pro testpace]$ cat /etc/passwd | grep useraa
    33 useraa1:x:1001:1001::/home/useraa1:/bin/bash
    34 useraa2:x:1002:1002::/home/useraa2:/bin/bash
    35 useraa3:x:1003:1003::/home/useraa3:/bin/bash
    36 [ucm@MacBook-Pro testpace]$ 

    批量删除一般用户

     1 [ucm@MacBook-Pro testpace]$ cat userdel.sh 
     2 #!/bin/bash
     3 
     4 #批量删除用户
     5 
     6 for i in $(cat /etc/passwd | grep -v root | grep "/bin/bash" | cut -f 1 -d ":")
     7     do
     8         userdel -r $i
     9     done
    10 [ucm@MacBook-Pro testpace]$ 

    七  while循环和until循环

    while  条件成立,则进行循环

    until  条件不成立,则进行循环

    while [ 条件判断式 ]

      do

        程序

      done

     1 [ucm@MacBook-Pro testpace]$ cat whileadd.sh 
     2 #!/bin/bash
     3 #从1加到100
     4 i=1
     5 s=0
     6 while [ $i -le 100 ]
     7 #如果变量i的值小于等于100,则执行循环
     8     do
     9         s=$(( $s + $i ))
    10         i=$(( $i + 1 ))
    11     done
    12 echo "The sum is : $s"
    13 [ucm@MacBook-Pro testpace]$ ./whileadd.sh 
    14 The sum is : 5050
    15 [ucm@MacBook-Pro testpace]$ 

     until

     1 [ucm@MacBook-Pro testpace]$ cat whileadd.sh 
     2 #!/bin/bash
     3 #从1加到100
     4 i=1
     5 s=0
     6 #while [ $i -le 100 ]
     7 #如果变量i的值小于等于100,则执行循环
     8 until [ $i -gt 100 ]
     9 #循环直到变量i的值大于100,则停止循环
    10     do
    11         s=$(( $s + $i ))
    12         i=$(( $i + 1 ))
    13     done
    14 echo "The sum is : $s"
    15 [ucm@MacBook-Pro testpace]$ ./whileadd.sh 
    16 The sum is : 5050
    17 [ucm@MacBook-Pro testpace]$ 
  • 相关阅读:
    BUAA OO Unit1 表达式求导
    中介者模式
    命令模式
    观察者模式
    解释器模式
    策略模式
    迭代器模式
    模板方法模式
    代理模式
    桥接模式
  • 原文地址:https://www.cnblogs.com/jxdong116/p/6240188.html
Copyright © 2020-2023  润新知