条件测试操作:
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,
当返回值为0(真true)时表示成功,
返回值为非0值(假false)时表示失败或异常。
test 命令
test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立
($?返回值为 0 表示条件成立)。
test 条件表达式
[ 条件表达式 ] #中括号两边要留有空格
文件测试
test 选项 文件/目录路径 test 选项 $变量
[ 选项 文件/目录路径 ] [ 选项 $变量 ]
常用的操作符:
-e: 测试目录或文件是否存在(Exist)。
-d: 测试是否为目录(Directory)。
-f: 测试是否为文件(File)。
-r: 测试当前用户是否有权限读取(Read)。
-w:测试当前用户是否有权限写入(Write)。
-x: 测试是否设置有可执行(Excute)权限。
-L: 测试是否为符号链接
应用
-e: 测试目录或文件是否存在(Exist)
[root@l1 ~]# cd /opt/
[root@l1 opt]# ls
first.sh password.txt rh xy101.txt
[root@l1 opt]#
[root@l1 opt]# test -e xy101.txt //是否存在xy101.txt文件
[root@l1 opt]# echo $?
0 //成立
[root@l1 opt]#
[root@l1 opt]# test -e tt.txt //是否存在tt.txt文件
[root@l1 opt]# echo $?
1 //不成立
[root@l1 opt]#
[root@l1 opt]# ls
first.sh password.txt rh xy101.txt
[root@l1 opt]#
[root@l1 opt]# [ -e xy101.txt ] //是否存在xy101.txt文件
[root@l1 opt]# echo $?
0 //成立
[root@l1 opt]#
[root@l1 opt]# [ -e aa.txt ] //是否存在aa.txt文件
[root@l1 opt]# echo $?
1 //不成立
[root@l1 opt]#
-d: 测试是否为目录(Directory)
-f: 测试是否为文件(File)
-r: 测试当前用户是否有权限读取(Read)。
-w:测试当前用户是否有权限写入(Write)。
-x: 测试是否设置有可执行(Excute)权限。
-L: 测试是否为符号链接
[root@l1 opt]# test -L xy101.txt2 //xy101.txt2是否为符号链接
[root@l1 opt]# echo $?
0 //成立
[root@l1 opt]# test -L aa //aa是否为符号链接
[root@l1 opt]# echo $?
1 //不成立
[root@l1 opt]# [ -L xy101.txt2 ] //xy101.txt2是否为符号链接
[root@l1 opt]# echo $?
0 //成立
[root@l1 opt]# [ -L aa ] //aa是否为符号链接
[root@l1 opt]# echo $?
1 //不成立
整数值比较
格式:[ 整数变量1 操作符 整数变量2 ]
常用的操作符:
-eq: 等于 ==
-ne: 不等于 !=
-gt: 大于 \>
-lt: 小于 \<
-le: 小于等于
-ge: 大于等于
[[ 运算表达式 选项 整数 ]]
[root@l1 opt]# test 100 -eq 100 //100等于100
[root@l1 opt]# echo $?
0 //√
[root@l1 opt]# test 100 -eq 200 //100等于200
[root@l1 opt]# echo $?
1 //×
[root@l1 opt]# test 100 -ne 200 //100不等于200
[root@l1 opt]# echo $?
0 //√
[root@l1 opt]# test 100 -ne 100 //100不等于200
[root@l1 opt]# echo $?
1 //×
[root@l1 opt]#
[root@l1 opt]# test 100 -gt 200 //100大于200
[root@l1 opt]# echo $?
1 //×
[root@l1 opt]# test 100 -gt 100 //100大于100
[root@l1 opt]# echo $?
1 //×
[root@l1 opt]# test 100 -ge 100 //100大于等于100
[root@l1 opt]# echo $?
0 //√
[root@l1 opt]# test 100 -lt 100 //100小于100
[root@l1 opt]# echo $?
1 //×
[root@l1 opt]# test 100 -lt 200 //100小于200
[root@l1 opt]# echo $?
0 //对
[root@l1 opt]# test 100 -le 100 //100小于等于100
[root@l1 opt]# echo $?
0 //√
[root@l1 opt]# test 50 -le 100 //50小于等于100
[root@l1 opt]# echo $?
0 //√
[root@l1 opt]# test 200 -le 100 //200小于等于100
[root@l1 opt]# echo $?
1 //×
[root@l1 opt]#
[root@l1 opt]# a=10
[root@l1 opt]# [ $a -eq 10 ] //10等于10
[root@l1 opt]# echo $?
0
[root@l1 opt]# [ $a -ge 8 ] //10大于8
[root@l1 opt]# echo $?
0
[root@l1 opt]# [ $a -lt 8 ] //10小于8
[root@l1 opt]# echo $?
1
[root@l1 opt]# [ $a -ne 8 ] //10不等于8
[root@l1 opt]# echo $?
0
[root@l1 opt]#
((99+1 == 100)) && echo true || echo false
[[ 99+1 -eq 100 ]]
字符串比较
格式1:
test "字符串1" == "字符串2" [ "字符串1" == "字符串2" ] [[ "字符串1" == "字符串2" ]]
#判断字符串是否相同
test "字符串1" != "字符串2" [ "字符串1" != "字符串2" ] [[ "字符串1" != "字符串2" ]]
#判断字符串是否不同
[[ "字符串1" =~ "字符串2 ]] # 判断字符串1是否包含字符串2
格式2:
test -z "字符串" test -z "$变量" [ -z "$变量" ] #判断字符串或变量是否为空
test -n "字符串" test -n "$变量" [ -n "$变量" ] #判断字符串或变量是否有字符串
请注意:引号的使用,这是防止空格扰乱代码的好方法
test "字符串1" == "字符串2" [ "字符串1" == "字符串2" ] #判断字符串是否相同
[root@l1 opt]# a=abc
[root@l1 opt]# echo $?
0
[root@l1 opt]# echo $a
abc
[root@l1 opt]#
[root@l1 opt]# [ "$a" = "abc" ]
[root@l1 opt]# echo $?
0
[root@l1 opt]#
test -z "字符串" test -z "$变量" [ -z "$变量" ] #判断字符串或变量是否为空
test -n "字符串" test -n "$变量" [ -n "$变量" ] #判断字符串或变量是否有字符串
[[ "字符串1" =~ "字符串2 ]] # 判断字符串1是否包含字符串2
[[ "字符串1" == "字符串2" ]] #判断字符串是否相同
[[ "字符串1" != "字符串2" ]] #判断字符串是否不同
逻辑测试
常用的操作符:
-a或&& :逻辑与,“而且”的意思,前后条件需都成立
-o或|| :逻辑或,“或者”的意思,只需前后条件中一个成立
! :逻辑否注 :!取反,反向判断
[ 表达式1 ] && [ 表达式2 ] [ 表达式1 -a 表达式2 ] [[ 表达式1 && 表达式2 ]]
#且,要求前后表达式条件都成立
[ 表达式1 ] || [ 表达式2 ] [ 表达式1 -o 表达式2 ] [[ 表达式1 || 表达式2 ]]#或,只需前后表达式条件成立一个即可
[ 表达式1 ] || 命令1 #如果表达式1条件成立不会执行或运算符后面的命令1,如果表达式1条件不成立则会执行或运算符后面的命令1
[ 表达式1 ] && 命令1 || 命令2 #如果表达式1条件成立则执行命令1,如果表达式1条件不成立则命令2
[ ! 表达式1 ] #取反,如果表达式1条件成立则最终结果为条件不成立
[ ! 表达式1 ] #取反,如果表达式1条件成立则最终结果为条件不成立
[root@l1 opt]# [ 100 -gt 99 ] //100大于99
[root@l1 opt]# echo $?
0
[root@l1 opt]# [ ! 100 -gt 99 ] //100大于99取反
[root@l1 opt]# echo $?
1
[root@l1 opt]#
-a或&& :逻辑与,“而且”的意思,前后条件需都成立
[root@l1 opt]# a=100
[root@l1 opt]# [ $a -gt 99 ] && [ $a -eq 100 ] //a大于99且a等于100
[root@l1 opt]# echo $?
0
[root@l1 opt]# [ $a -gt 99 ] && [ $a -ne 100 ] //a大于99且a小于100
[root@l1 opt]# echo $?
1
[root@l1 opt]#
[root@l1 opt]# [ $a -gt 99 -a $a -ne 100 ] //100大于99 且 100不等于100
[root@l1 opt]# echo $?
1
[root@l1 opt]# [ $a -gt 99 -a $a -eq 100 ] //100大于99 且 100等于100
[root@l1 opt]# echo $?
0
[root@l1 opt]#
-o或|| :逻辑或,“或者”的意思,只需前后条件中一个成立
[root@l1 opt]# [ $a -gt 99 ] || [ $a -ne 100 ] //100大于99 或 100小于99
[root@l1 opt]# echo $?
0
[root@l1 opt]# [ $a -gt 999 ] || [ $a -ne 100 ] //100大于999 或 100小于100
[root@l1 opt]# echo $?
1
[root@l1 opt]# [ $a -gt 999 ] || [ $a -eq 100 ] //100大于999 或 100等于100
[root@l1 opt]# echo $?
0
[root@l1 opt]# [ $a -gt 99 -o $a -eq 100 ] //100大于99 或 100等于100
[root@l1 opt]# echo $?
0
[root@l1 opt]# [ $a -gt 99 -o $a -ne 100 ] //100大于99 或 100不等于100
[root@l1 opt]# echo $?
0
[root@l1 opt]#
[ 表达式1 ] || 命令1
#如果表达式1条件成立不会执行或运算符后面的命令1,如果表达式1条件不成立则会执行或运算符后面的命令1
[ 表达式1 ] && 命令1 || 命令2
#如果表达式1条件成立则执行命令1,如果表达式1条件不成立则命令2
[root@l1 opt]# echo $a
100
[root@l1 opt]# [ $a -lt 99 ] || echo fales //100小于99 输出fales
fales
[root@l1 opt]# [ $a -gt 99 ] && echo true || echo fales //100大于99 输出true,大于99不成立输出fales
true
[root@l1 opt]# [ $a -lt 99 ] && echo true || echo fales //100小于99 输出true,大于99不成立输出fales
fales
[root@l1 opt]#
ping 命令
-c:发送包的个数
-i:发送包的间隔时间
-W:超时时间
-w:多少秒后停止 ping 命令操作
[root@l1 opt]# ping -c 4 -i 0.5 -w 2 baidu.com //ping百度4个包 0.5秒一个 2秒结束
PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=1 ttl=128 time=29.1 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=2 ttl=128 time=26.8 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=3 ttl=128 time=29.2 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=4 ttl=128 time=26.5 ms
--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 1503ms
rtt min/avg/max/mdev = 26.570/27.938/29.237/1.259 ms
[root@l1 opt]#
[root@l1 opt]# ping -c 4 -i 0.5 -w 2 baidu.com &> /dev/null //静默ping百度
[root@l1 opt]# echo $?
0
[root@l1 opt]# ping -c 4 -i 0.5 -w 2 192.168.18.10 &> /dev/null && echo "it is online " || echo "it is offline" //静默ping通it is online不通it is online
it is online
[root@l1 opt]# ping -c 4 -i 0.5 -w 2 192.168.18.20 &> /dev/null && echo "it is online " || echo "it is offline" //静默ping通it is online不通it is online
it is offline
[root@l1 opt]#
vim ping.sh
[root@l1 opt]# vim ping.sh
[root@l1 opt]# chmod +x ping.sh
[root@l1 opt]# ./ping.sh 192.168.16.10
192.168.16.10 it is offline
[root@l1 opt]# ./ping.sh 192.168.16.20
192.168.16.20 it is offline
判断进程是否正在运行的方法:
systemctl status 进程服务
netstat -lntup | grep :端口/进程名
ss -lntup | grep :端口/进程名
lsof -i :端口
ps -elf | grep 进程名 | grep -v "grep" | grep -v "$$" | wc -l
pidof 进程名 | wc -w
killall -0 进程名
[root@l1 ~]# systemctl status httpd //查看服务状态
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: man:httpd(8)
man:apachectl(8)
[root@l1 ~]#
[root@l1 ~]# ss -lntp | grep httpd
[root@l1 ~]# ss -lntp | grep 80
[root@l1 ~]# echo $?
1
[root@l1 ~]# ss -lntp | grep 80 || systemctl start httpd //查看端口号80 或 打开httpd服务
[root@l1 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since 三 2024-05-08 23:20:13 CST; 9s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 4316 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
Tasks: 6
CGroup: /system.slice/httpd.service
├─4316 /usr/sbin/httpd -DFOREGROUND
├─4323 /usr/sbin/httpd -DFOREGROUND
├─4324 /usr/sbin/httpd -DFOREGROUND
├─4325 /usr/sbin/httpd -DFOREGROUND
├─4326 /usr/sbin/httpd -DFOREGROUND
└─4327 /usr/sbin/httpd -DFOREGROUND
5月 08 23:19:53 l1 systemd[1]: Starting The Apache HTTP Server...
5月 08 23:20:03 l1 httpd[4316]: AH00558: httpd: Could not reliabl...e
5月 08 23:20:13 l1 systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@l1 ~]#
[root@l1 ~]# ss -lntp | grep 80 && echo 'httpd is starting|| systemctl start httpd
> ^C
[root@l1 ~]# ss -lntp | grep 80 && echo 'httpd is starting' || systemctl start httpd
LISTEN 0 128 [::]:80 [::]:* users:(("httpd",pid=4327,fd=4),("httpd",pid=4326,fd=4),("httpd",pid=4325,fd=4),("httpd",pid=4324,fd=4),("httpd",pid=4323,fd=4),("httpd",pid=4316,fd=4))
httpd is starting
[root@l1 ~]# ss -lntp | grep 80 &> /dev/null && echo 'httpd is starting' || systemctl start httpdhttpd is starting
[root@l1 ~]#
if条件语句的语法:
单分支
if [ 条件表达式 ] if test 条件表达式 if 命令行 &> /dev/null
then
命令序列
...
fiif [ 条件表达式 ];then
命令序列
...
fi等效于
[ 条件表达式 ] && 命令
双分支
if [ 条件表达式 ]
then
命令序列
else
命令序列
fi等效于
[ 条件表达式 ] && 命令1 || 命令2
多分支
if [ 条件表达式 ];then
命令序列
elif [ 条件表达式 ];then
命令序列
elif [ 条件表达式 ];then
命令序列
....
else
命令序列
fi
case多分支语句的语法:![](https://img-blog.csdnimg.cn/direct/63b1eb313cdf480fa484b668629c8a7c.png)
case $变量 in
模式1)
命令序列
;;
模式2)
命令序列
;;
....
*)
命令序列
esac