Shell编程之条件语句

条件测试操作:

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
  命令序列
  ...
fi  

if [ 条件表达式 ];then
  命令序列
  ...
fi 

等效于
[ 条件表达式 ] && 命令
 

双分支

if [ 条件表达式 ]
then
  命令序列
else
  命令序列
fi 

等效于
[ 条件表达式 ] && 命令1 || 命令2

多分支

if [ 条件表达式 ];then
  命令序列
elif [ 条件表达式 ];then
  命令序列
elif [ 条件表达式 ];then
  命令序列
....
else
  命令序列
fi 

 

 

 

 

case多分支语句的语法:

 

case $变量 in
模式1)
  命令序列
  ;;
模式2)
  命令序列
  ;;
....
*)
  命令序列
esac

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值