条件测试
- 当需要对执行的某一条命令执行的结果状态进行判断的时候,需要进行条件测试。
- 使用test 条件表达式 或者 [ 条件表达式 ]
- 两层方括号表示模式匹配,可以用通配符
- 示例:[[ aa.sh == *.sh ]] && echo y || echo n
- 文件测试
- 对文件测试意思是,根据给的文件的路径(绝对路径或相对路径),判断对应的是文件还是目录,或者是文件或目录的读写执行权限。
- -d 表示测试是否是目录(Directory)
- -f 表示测试是否为文件(file)
- -e 表示测试目录或文件是否存在(exist)
- -r 表示测试当前用户是否有权限读(read)
- -w 表示测试当前用户是否有权写入(write)
- -x 表示测试是否可执行(execute)
- 整数值比较
- -eq :等于
- -ne :不等于
- -gt :大于
- -lt :小于
- ge :大于等于
- le :小于等于
- 字符串比较
- = :字符串1与字符串2相同
- != :字符串1与字符串2不相同
- -z :检查字符串是否为空,对于未定义或赋予空值的变量将视为空串。
- -n :检查字符串是否非空,变量赋予值为非空。
- 逻辑测试
- && :逻辑与,表示“并且”,当前后两个测试语句都成立时,整个测试命令的返回值为0。可以用 -a
- 示例 [ 测试语句1 -a 测试语句2 ] 也可以用 [ 测试语句1 ] && [ 测试语句2 ]
- || :逻辑或,表示“或者”,前后两个测试语句只需要满足一个成立,返回值为0。
- 示例 [ 测试语句1 -o 测试语句2 ] 也可以用 [ 测试语句1 ] || [ 测试语句2 ]
- ! :逻辑非,表示“不”,当测试语句不成立时,返回值为0。
- && :逻辑与,表示“并且”,当前后两个测试语句都成立时,整个测试命令的返回值为0。可以用 -a
if语句
if语句的结构
1、单分支if
语法格式如下:
if 测试语句
then
命令序列
fi
2、双分支if
语法格式如下:
if 测试语句
then
命令序列1
else
命令序列2
fi
3、多分支if
语法格式如下
if 测试语句1
then
命令序列1
elif 测试语句2
then
命令序列2
.
. //省略部分elif
.
else
命令序列n…
fi
if分支的简单应用
[root@localhost ~]# vim hashome.sh
#!/bin/bash
#判断用户有无家目录的脚本
#作者:lvbin
read -p "请输入用户名:" name
cat /etc/passwd | grep ^$name
if [ $? -eq 0 ];then
if [ $name == root ];then
echo "该用户是管理员用户,家目录是$HOME"
else
ls /home | grep $name
if [ $? -eq 0 ];then
echo "该$name用户家目录是/home/$name"
fi
fi
else
echo "没有此用户"
fi
case 分支
case分支介绍
case分支适用于当某个变量存在多种取值,需要对其中的每一种取值执行不同的命令序列。
case语法结构如下:
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
......
*)
默认命令序列
esac
case语句的执行流程
首先使用变量值与模式1比较,若比较值相同,则执行模式1下面的命令序列1,直到遇见 “ ;; ” 后跳转到esac,表示分支结束。若与模式1不匹配,则往下匹配模式2,如相同,则执行模式2的命令序列2,直到遇见 “ ;; ” 后跳转到esac,表示分支结束,依次类推,如果都不匹配,则执行默认的 *)下面的默认命令序列。
注意事项:
1、case行尾必须为单词 in,每一个模式必须以右括号 “ ) ”结尾。
2、双分号“ ;; ”表示命令序列结束。
3、模式字符串种,可以用方括号表示一个连续的方位,例如“[0-9]”,还可以用竖杠 “|”表示或,例如“a|b”。
4、最后的 *)表示默认模式,其中*相当于通配符。
case的简单应用
[root@localhost ~]# vim caiquan.sh
#!/bin/bash
#猜拳小游戏
#作者:lvbin
echo "人机猜拳小游戏"
read -p "请输入剪刀、石头或布:" chose
#随机数模3取余,0代表剪刀、1代表石头、2代表布
computer=$[RANDOM%3]
case $chose in
"剪刀")
if [ $computer -eq 0 ];then
echo "电脑出剪刀,平局"
elif [ $computer -eq 1 ];then
echo "电脑出石头,你输了"
else
echo "电脑出布,你赢了"
fi
;;
"石头")
if [ $computer -eq 0 ];then
echo "电脑出剪刀,你赢了"
elif [ $computer -eq 1 ];then
echo "电脑出石头,平局"
else
echo "电脑出布,你输了"
fi
;;
"布")
if [ $computer -eq 0 ];then
echo "电脑出剪刀,你输了"
elif [ $computer -eq 1 ];then
echo "电脑出石头,你赢了"
else
echo "电脑出布,平局"
fi
;;
esac