之前讲到shell的一些基础知识,这节主要说一下shell中多分支判断if和case。
一.分支判断
1、命令执行是否成功
$?
2、shell内置的判断命令
test 条件表达式 test 5 -gt 3
[] [ 5 -gt 3 ] //表达式两边一定要有空格
[[]] //这两种表达方式有一些细微区别,[[]],大部分的功能跟[]是一样的,
可以简单理解成[]的扩展,但对于参数的判断定义上,比test有更完整的定义,不容易出现[]中的错误
具体使用:
1)字符串判断
-n STRING —— 字符串非空时结果为真
-z STRING —— 字符串为空时结果为真
STRING1 = STRING2 —— 两个字符串相同时为真
STRING1 != STRING2 —— 两个字符串不相同时为真
2)数值比较
INTEGER1 -eq INTEGER2 —— 判断两个值是否相等
INTEGER1 -ge INTEGER2 —— 大于等于
INTEGER1 -gt INTEGER2 —— 大于
INTEGER1 -le INTEGER2 —— 小于等于
INTEGER1 -lt INTEGER2 —— 小于
INTEGER1 -ne INTEGER2 —— 不等于
3)文件的判断
-d FILE —— 文件存在并且是个目录则为真
-e FILE —— 文件存在则为真
-f FILE —— 文件存在并且是个常规文件则为真
-s FILE —— 文件存在并且其大小不为零则为真
4)其他判断
-a FILE -- 文件存在则为真
-b FILE -- 文件存在并且是个块设备文件则为真
-c FILE -- 文件存在并且是个字符设备文件则为真
-g FILE -- 文件存在并且设置了有效组号则为真
-h FILE -- 文件存在并且是个符号链接则为真
-k FILE -- 文件存在并且设置了"滞留位"则为真
-p FILE -- 文件存在并且是个命名管道(FIFO)则为真
-r FILE -- 文件存在并且可读则为真
-t 文件描述符 -- 文件描述符已打开并且指向终端则为真
-u FILE -- 文件存在并且设置了有效用户号则为真
-w FILE -- 文件存在并且可写则为真
-x FILE -- 文件存在并且可执行则为真
-O FILE -- 文件存在并且被其有效用户号所拥有则为真
-G FILE -- 文件存在并且被其有效组号所有用则为真
-L FILE -- 文件存在并且是个符号链接则为真
-S FILE -- 文件存在并且是个套接字则为真
-N FILE -- 文件存在并且大上次读取过后被修改过则为真
[root@shell ~]# test -e /etc/passwd
[root@shell ~]# echo $?
0
[root@shell ~]# [ -e /etc/passwd ]
[root@shell ~]# echo $?
0
[root@shell ~]# [ "abcd" = "abcd" ]
[root@shell ~]# echo $?
0
3、命令的逻辑运算
逻辑与: &&
逻辑或: ||
逻辑非: !
二.if判断的语法结构
注意:if和fi要成对出现
1)最简单的语法
if 条件表达式或者命令
then
命令;
fi
[root@shell ~]
#!/bin/bash
if [ -e /etc/passwd ]
then
echo "file exists"
fi
[root@shell ~]
file exists
2)分支的if结构语法
if 条件表达式或者命令
then
命令;
else
命令;
fi
[root@shell ~]
#!/bin/bash
read -p "Please input a filename: " filename
if [ -e $filename ]
then
echo "file $filename exists."
else
echo "file $filename not exists."
fi
[root@shell ~]
Please input a filename: /etc/passwd
file /etc/passwd exists.
[root@shell ~]
Please input a filename: /etc/douniwan
file /etc/douniwan not exists.
3)多分支if结构语法
if 条件表达式或者命令
then
命令;
elif 条件表达式或者命令 //elif可以有多个
then
命令;
else
命令;
fi
[root@shell ~]
#!/bin/bash
read -p "请输入分数:" score
if [ -z $score ]
then
echo "分数不能为空"
exit
fi
if [ $score -gt 100 -o $score -lt 0 ]
then
echo "非法的分数值"
exit
fi
if [ $score -ge 90 ]
then
echo "优秀"
elif [ $score -ge 80 ]
then
echo "良好"
elif [ $score -ge 60 ]
then
echo "一般"
else
echo "不及格"
fi
多重条件判断
条件表达式1 选项 条件表达式2
选项:
-a:并且 &&
-o:或者 ||
!条件表达式 :取反,非
条件表达式补充
[[]] 模式匹配
(()) 数值判断
三.case:多分支判断
语法结构:
case 变量 in
值1)
命令1
;;
值2)
命令2
;;
... ...
... ...
值n)
命令n
;;
*)
命令
;;
esac
如果变量的值满足的是 值1,执行命令1;如果不满足,继续执行命令2,... ... * 表示的通配,除了上面所有的值以外的值
[root@shell ~]]
#!/bin/bash
read -p "Please input a username: " username
case $username in
root)
echo "You are super user."
;;
oracle)
echo "You are oracle account."
;;
*)
echo "You are nothing."
;;
esac
同时匹配两个变量的方法:
1、将两个变量看成一个整体
[root@shell ~]
#!/bin/bash
read -p "Please input your username: " username
read -s -p "Please input your password: " password
case "$username $password " in
"root redhat" )
echo "You are right."
;;
"oracle ora" )
echo "You are right for oracle."
;;
*)
echo "You are wrong."
;;
esac
2、用任意符号分隔两个变量
case $username,$password in
root,redhat)