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]$
举个例子:判断输入的文件类型
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]
五 多分支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]$
六 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]$