文件测试
文件测试格式:
格式一: test 操作符 表达式
格式二: [ 操作符 表达式 ]
常用的文件测试操作符:
操作符 | 作用 |
---|---|
-d | 测试文件是否为目录文件(Directory) |
-f | 测试文件是否为普通文件(File) |
-e | 测试目录或文件是否存在(Exist) |
-r | 测试当前用户是否有权限读取(Read) |
-w | 测试当前用户是否有权限写入(Write) |
-x | 测试当前用户是否有权限执行(eXcute) |
-L | 测试是否为符号链接(软链接文件) |
示例1
[root@localhost ~]# test -d /etc/ //测试是否为目录
[root@localhost ~]# echo $? //状态码返回0,表示为真,是目录
0
[root@localhost ~]# test -f /etc/sysconfig/ //测试是否为普通文件
[root@localhost ~]# echo $? //状态码返回1,表示为假,不是普通文件
1
整数测试
[ 整数变量1 操作符 整数变量2 ]
test 整数变量1 操作符 整数变量2
操作符:
操作符 | 含义 |
---|---|
-eq | 等于(Equal) |
-ne | 不等于(Not Equal) |
-gt | 大于(Greater Than) |
-lt | 小于(Lesser Than) |
-le | 小于或等于(Lesser or Equal) |
-ge | 大于或等于(Greater or Equal) |
逻辑测试(短路运算)
逻辑测试用于连接多个测试条件,并返回整个表达式的值。 逻辑测试主要有"逻辑与","逻辑或","逻辑否"三种。
逻辑测试两种格式:
格式一:[ 表达式1 ] 逻辑运算符 [ 表达式2 ] ...
#例:[表达式1] && [表达式2] 等同于 [表达式1 -a 表达式2] 等同于 [[表达式1 && 表达式2]]
#例:[表达式1] || [表达式2] 等同于 [表达式1 -o 表达式2] 等同于 [[表达式1 || 表达式2]]
格式二:命令1 逻辑运算符 命令2 ...
逻辑运算符:
- -a或&& :逻辑与,“而且”的意思,全真才为真。
- -o或|| :逻辑或,“或者”的意思,一真即为真。
- ! :逻辑否。
if 单分支结构
单分支语句格式:
if 判断条件
then //条件成立的分支代码
fi //条件不成立直接结束
示例
检查用户家目录中的 20.sh 文件是否存在,并且检查是否有执行权限
[root@localhost ~]# vim 20.sh
if [ -f ~/test.sh ]
then
echo "文件存在"
if [ -x ~/test.sh ]
then
echo "文件有可执行权限"
else
echo "文件没有可执行权限"
fi
else
echo "文件不存在"
fi
[root@localhost ~]# sh 20.sh
文件存在
文件没有可执行权限
if 双分支结构
双分支语句结构:
if 条件判断式
then
当条件判断成立时,可以进行的命令工作内容
else
当条件判断不成立时,可以进行的命令工作内容
fi
示例
提示用户输入内容,使用if 语句判断输入的内容是否为整数。
[root@localhost ~]# vim si.sh
read -p "数字:" num
let n=$num+1 &> /dev/null
if [ $? -eq 0 ]
then
echo "是整数"
else
echo "不是整数"
fi
[root@localhost ~]# sh si.sh
数字:4
是整数
[root@localhost ~]# sh si.sh
数字:4.5
不是整数
if 多分支结构
多分支语句格式:
if 判断条件1
then
条件1为真的分支代码
elif 判断条件2
then
条件2为真的分支代码
elif 判断条件3
then
条件3为真的分支代码
...
else
以上条件都为假的分支代码
fi
示例
提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误
[root@localhost ~]# vim er.sh
read -p "请输入秒数:" sec
if [ $sec -gt 0 ] && [ $sec -le 10 ]
then
read -p "输入性别:" sex
if [ $sex == "男" ]
then
echo "男生组"
elif [ $sex == "女" ]
then
echo "女生组"
else
echo "请重新输入"
fi
else
echo "淘汰"
fi
[root@localhost ~]# sh er.sh
请输入秒数:2
输入性别:男
男生组
case语句
格式:
case 变量引用 in
模式1)
命令分支1
;;
模式2)
命令分支2
;;
...
*)
默认命令分支
esac
示例
用case语句在/etc/init.d/目录中写一个firewalld脚本,并加入到系统服务管理中使能够使用 service firewalld start|stop|restart|status 来管理firewalld服务,要求如果命令选项不对,则提示 “用法: $0 {start|stop|status|restart}”。
[root@localhost ~]# vim qi.sh
read -p "管理防火墙命令" firewalld
case $firewalld in
start)
systemctl start firewalld
echo "防火墙已开启"
;;
stop)
systemctl stop firewalld
echo "防火墙已关闭"
;;
restart)
systemctl restart firewalld
echo "防火墙已重启"
;;
status)
systemctl status firewalld
echo "查看状态"
;;
*)
echo "用法$0{start|stop|restart|status}"
esac
[root@localhost ~]# sh qi.sh
管理防火墙命令start
防火墙已开启
[root@localhost ~]# sh qi.sh
管理防火墙命令stop
防火墙已关闭