条件控制语句
if常见的判断逻辑运算符
-f 判断文件是否存在;
-d 判断目录是否存在;
-eq 等于,应用于整型比较 equal;
-ne 不等于,应用于整型比较 not equal;
-lt 小于,应用于整型比较 letter;
-gt 大于,应用于整型比较 greater;
-le 小于或等于,应用于整型比较;
-ge 大于或等于,应用于整型比较;
-a 双方都成立(and) 逻辑表达式 –a 逻辑表达式;
-o 单方成立(or) 逻辑表达式 –o 逻辑表达式;
-z 空字符串;
-x 是否具有可执行权限
|| 单方成立;
&& 双方都成立表达式
通常以if开头,fi结尾。也可加入else或者elif进行多条件的判断
单分支语句
if (条件表达式);then
语句1
fi
双分支if 语句
if (表达式)
语句1
else
语句2
fi
多分支条件语句
if (表达式);then
语句1
elif (表达式2);then
语句2
elif(表达式3;then
语句3
fi
如果表达式为真,则执行命令表种的命令;否则退出if语句,即执行fi后面的语句,f和fi是条件语句的语句括号,必须成对使用。
测试
判断文件是否存在
if [ -e $1 ]
then
echo "$1 存在"
fi
[root@VM-12-14-centos ~]# ./test1.sh test.sh
test.sh 存在
判断目录是否存在
if [ -d $1 ]
then
echo "$1 存在"
else
echo "$1 不存在"
fi
[root@VM-12-14-centos ~]# ./test2.sh test
test 不存在
判断是文件还是目录
if [ -e $1 ]
then
echo "$1 是文件"
elif [ -d $1 ]
then
echo "$1 是目录"
else
echo "$1 都不是"
fi
[root@VM-12-14-centos ~]# ./test2.sh test.sh
test.sh 是文件
[root@VM-12-14-centos ~]# ./test2.sh gawda
gawda 都不是
注意:if和elif后面都要跟then,else不能跟then
case语句
case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句调用格式如下
case expression in
pattern1)
statement1
;;
pattern2)
statement2
;;
pattern3)
statement3
;;
#其他pattern情形
*)
statementn
esac
1.case、in 和 esac 都是 Shell 关键字,expression 表示表达式,pattern 表示匹配模式。
2.expression 既可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要能够得到 expression 的值就可以。
3.pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式。有时候相近的内容作为一个pattern时,这些内容以“|”隔开,比如 y|yes|YES)。
4.如果 expression 和某个模式匹配成功,就会执行这模式后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号;;才停止;然后整个 case 语句就执行完了,程序会跳出整个 case 语句,执行 esac 后面的其它语句。
5.如果 expression 没有匹配到任何一个模式,那么就执行*)后面的语句,直到遇见双分号;;或者esac才结束。最后一个分支可以写;;,也可以不写,因为无论如何,执行到 esac 都会结束整个 case in 语句。
6.最后一个分支*)并不是什么语法规定,它只是一个正则表达式,*表示任意字符串,所以不管 expression 的值是什么,*)总能匹配成功。
测试
read num
case $num in
1)
echo "a"
;;
2)
echo "b"
;;
3)
echo "c"
;;
*)
echo "error"
esac
[root@VM-12-14-centos ~]# ./test3.sh
1
a
[root@VM-12-14-centos ~]# ./test3.sh
2
b
[root@VM-12-14-centos ~]# ./test3.sh
666
error
case in 的 pattern 部分支持简单的正则表达式,具体来说,可以使用以下几种格式:
* 表示任意字符串。
[abc] 表示 a、b、c 三个字符中的任意一个。比如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个。
[m-n] 表示从 m 到 n 的任意一个字符。比如,[0-9] 表示任意一个数字,[0-9a-zA-Z] 表示字母或数字。
| 表示多重选择,类似逻辑运算中的或运算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"
测试
read char
case $char in
[a-zA-Z])
printf "\nletter\n"
;;
[0-9])
printf "\nDigit\n"
;;
[,.?!])
printf "\nPunctuation\n"
;;
*)
printf "\nerror\n"
esac
[root@VM-12-14-centos ~]# ./test4.sh
a
letter
[root@VM-12-14-centos ~]# ./test4.sh
5
Digit
[root@VM-12-14-centos ~]# ./test4.sh
;
error
[root@VM-12-14-centos ~]# ./test4.sh
?
Punctuation
逻辑运算符
! 非运算,表达式为 true 则返回 false,否则返回 true。
-o 或(或者)运算,有一个表达式为 true 则返回 true。
-a 与(并且)运算,两个表达式都为 true 才返回 true。
测试
test.sh
a=10
b=20
if [ ! $a -lt 0 ]
then
echo "返回 true"
else
echo "返回 false"
fi
if [ $a -lt 20 -o $b -gt 100 ]
then
echo "返回 true"
else
echo "返回 false"
fi
if [ $a -lt 20 -a $b -gt 100 ]
then
echo "返回 true"
else
echo "返回 false"
fi
运行结果
[root@VM-12-14-centos ~]# ./test.sh
返回 true
返回 true
返回 false