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]$ 
原文地址:https://www.cnblogs.com/jxdong116/p/6240188.html