文章目录
前言
我们日常所判断的条件往往都不只是一种,有的条件给出的是满足的 需求,有的条件给的却是不满足的条件,因此我们也可以通过不同的方式来进行条件的选择与判断
一、条件测试
Shell环境根据命令执行后的返回状态值($?)来判断是否成功,当返回值为0时表示成功,非0表示失败或异常
使用测试命令时,包括以下两种形式:
test 条件表达式
[ 条件表达式 ] 注意空格
[[ ]]双括号可以模糊匹配
[root@yzq opt]# [ abc = abc ]
[root@yzq opt]# echo $?
0
[root@yzq opt]# [ abc = abc* ] && echo $?
[root@yzq opt]# [[ abc = abc* ]] && echo $?
0
[root@yzq opt]# [[ abc = ab? ]] && echo $?
0
1 文件测试
常用的测试操作符
-d: 测试是否为目录(Directory)
-e: 测试目录或文件是否存在(Exist)
-f: 测试是否为文件(File)
-r: 测试当前用户是否有读取权限(Read)
-w: 测试当前用户是否有权限写入(Write)
-x: 测试是否设置有权限执行(Excute)
-b: 测试是否为设备文件
-s: 测试文件是否存在且大小为空
-c: 测试是否为字符设备文件
-L: 测试是否为链接文件
[root@yzq opt]# test -e /etc/shadow
[root@yzq opt]# echo $?
0
[root@yzq opt]# [ -e /etc/shadow ]
[root@yzq opt]# echo $?
0
[root@yzq opt]# [ -d /etc/shadow ]
[root@yzq opt]# echo $?
1
[root@yzq opt]# [ -f /etc/shadow ]
[root@yzq opt]# echo $?
0
[root@yzq opt]# [ -r /etc/shadow ]
[root@yzq opt]# echo $?
0
[root@yzq opt]# [ -w /etc/shadow ]
[root@yzq opt]# echo $?
0
[root@yzq opt]# [ -x /etc/shadow ]
[root@yzq opt]# echo $?
1
[root@yzq opt]# ll /etc/shadow
----------. 1 root root 1459 7月 26 00:31 /etc/shadow
2 整数值比较
(无法做字符串比较)
-eq: 是否第一个数等于第二个数
-ne:是否第一个数不等于第二个数
-gt:是否 第一个数大于第二个数
-lt: 是否第一个数小于第二个数
-le: 是否第一个数小于或等于第二个数
-ge:是否第一个数大于或等于第二个数
(也可以用><=)
[root@yzq opt]# [ 6 -eq 3 ]
[root@yzq opt]# echo $?
1
[root@yzq opt]# [ 6 -ne 3 ]
[root@yzq opt]# echo $?
0
[root@yzq opt]# [ 9 -gt 8 ]
[root@yzq opt]# echo $?
0
[root@yzq opt]# [ 9 -lt 8 ]
[root@yzq opt]# echo $?
1
[root@yzq opt]# [ 9 -ge 8 ]
[root@yzq opt]# echo $?
0
[root@yzq opt]# [ 9 -le 8 ]
[root@yzq opt]# echo $?
1
3 字符串比较
=: 第一个字符串与第二个字符串是否相同
!=: 第一个字符串与第二个字符串是否不相同,“!”表示取反
-z:检查字符串是否为空,对于未定义或赋予空值的变量将是为空串
[root@yzq opt]# a=10
[root@yzq opt]# b=20
[root@yzq opt]# [ $a = $b ]
[root@yzq opt]# echo $?
1
[root@yzq opt]# [ $a != $b ]
[root@yzq opt]# echo $?
0
[root@yzq opt]# name=yeziqi
[root@yzq opt]# [ -z $name ]
[root@yzq opt]# echo $?
1
[root@yzq opt]# name=""
[root@yzq opt]# [ -z $name ]
[root@yzq opt]# echo $?
0
4 逻辑测试
&&:逻辑与,表示“而且”,只有当前后两个条件都成立,整个测试命令的返回值才为0(结果成立),“&&” 等同于 “-a”
|| :逻辑或,表示“或者”,只要前后两个条件有一个成立,整个测试命令的返回值即为0(结果成立),“||”等同于“-o”
!:逻辑否,表示“不”,只有当指定条件不成立时,整个测试命令的返回值才为0(结果成立)
[root@yzq opt]# a=10
[root@yzq opt]# b=20
[root@yzq opt]# [ a=b ] && [ 10 -lt 20 ] && echo 1
1
[root@yzq opt]# [ a=b ] && [ 10 -gt 20 ] && echo 1
[root@yzq opt]# [ a=b ] && [ 10 -gt 20 ] || echo 1
1
[root@yzq opt]# [ a=b ] && [ ! 10 -gt 20 ] && echo 1
1
[root@yzq opt]# [ 10 -lt 20 ] && echo "正确" || echo "错误"
正确
[root@yzq opt]# [ 10 -gt 20 ] && echo "正确" || echo "错误"
错误
二、if语句
1.单分支语句
只有在“条件成立”时,才会执行相应的代码
if 条件测试操作(或命令)
then
命令序列
fi
[root@yzq opt]# sh dan.sh
host is online
[root@yzq opt]# cat dan.sh
#!/bin/bash
ping -c 2 baidu.com &>/dev/nual
if [ $? -eq 0 ]
then
echo "host is online"
fi
2.双分支语句
针对“条件成立”“条件不成立”两种情况,分别执行相应的代码
if 条件测试操作(或命令)
then
命令序列
else
命令序列
fi
[root@yzq opt]# sh ping.sh baidu.com
host is online
[root@yzq opt]# sh ping.sh 199.199.199.199
host is down
[root@yzq opt]# cat ping.sh
#!/bin/bash
ping -c3 -W2 $1 &>>/dev/null
if [ $? -eq 0 ]
then
echo "host is online"
else
echo "host is down"
fi
3.多分支语句
嵌套使用,进行多次判断,针对“条件成立”“条件不成立”两种情况,分别执行相应的代码
if 条件测试操作 1
then
命令序列 1
elif 条件测试操作 2
then
命令序列 2
else
命令序列 3
fi
[root@yzq opt]# sh ping.sh baidu.com
host is online
[root@yzq opt]# sh ping.sh 199.199.199.199
host is down
[root@yzq opt]# sh ping.sh 199
host is down
[root@yzq opt]# cat ping.sh
#!/bin/bash
ping -c3 -W2 $1 &>>/dev/null
if [ $? -eq 0 ]
then
echo "host is online"
else
echo "host is down"
fi
三、case语句
1.case语句的结构
case语句可以使脚本程序的结构更加清晰,层次分明,常用语服务的启动,停止,重启的脚本,有的服务不提供这种控制脚本,需要使用case语句来编写。主要是适用于一下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列,这种情况与多分支的if语句相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同取值。
case语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
...
*)
默认命令序列
esac
2.case语句应用实列
1.判断字符
[root@yzq opt]# sh zifu.sh
请输入一个字符,并回车:9
你输入的是数字
[root@yzq opt]# sh zifu.sh
请输入一个字符,并回车:s
你输入的是字母
[root@yzq opt]# sh zifu.sh .
请输入一个字符,并回车:1
你输入的是数字
[root@yzq opt]# cat zifu.sh
#!/bin/bash
read -p "请输入一个字符,并回车:" key
case $key in
[a-z] | [A-Z])
echo "你输入的是字母"
;;
[0-99])
echo "你输入的是数字"
;;
*)
echo "请输入字母或0-99的数字:"
bash $0
esac
2.今天吃什么
[root@yzq opt]# sh chi.sh
今天周几(1-7): 0
???
[root@yzq opt]# sh chi.sh
今天周几(1-7): 7
不吃
[root@yzq opt]# cat chi.sh
#!/bin/bash
read -p "今天周几(1-7): " chi
case $chi in
[1-2])
echo "吃米饭";;
[3-4])
echo "吃面条";;
5)
echo "吃饼";;
[6-7])
echo "不吃";;
*)
echo "???"
esac
3.编写系统服务脚本
[root@yzq opt]# bash -x start.sh
+ read -p 请输入服务名称: server
请输入服务名称:httpd
+ rpm -q httpd
+ '[' 0 = 0 ']'
+ read -p 请输入操作,1开启,2关闭,3重启: caozuo
请输入操作,1开启,2关闭,3重启:2
+ case $caozuo in
+ systemctl stop httpd
+ echo 服务已关闭
服务已关闭
[root@yzq opt]# cat start.sh
#!/bin/bash
read -p "请输入服务名称:" server
rpm -q $server &> /dev/null
if [ $? = 0 ];then
read -p "请输入操作,1开启,2关闭,3重启:" caozuo
case $caozuo in
1)
systemctl start $server
echo "服务已启动";;
2)
systemctl stop $server
echo "服务已关闭";;
3)
systemctl restart $server
echo "服务以重启";;
esac
else
echo "服务不存在"·
fi
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76556.html