shell编程条件语句

条件测试

条件测试格式

测试表达式是否成立,若成立

test条件测试的表达式

[ 条件测试表达式 ] -两边都要有空格

test常用的操作符

++1-e :测试目录或者文件是否存在 ++

[root@localhost opt]# ls
rh
[root@localhost opt]# test -e rh
[root@localhost opt]# echo $?
0

++2-d :测试是否为目录++

[root@localhost opt]# test -d rh
[root@localhost opt]# echo $?
0

++3-f :测试是否为文件++

[root@localhost opt]# test -f rh
[root@localhost opt]# echo $?
1
-------------
[root@localhost opt]# touch 123.txt
[root@localhost opt]# test -f 123.txt 
[root@localhost opt]# echo $?
0

4-r :测试当前登录用户是否具有读权限

[root@localhost opt]# test -r 123.txt 
[root@localhost opt]# echo $?
0
----------
[root@localhost opt]# ll
总用量 0
-rw-r--r--. 1 root root 0 918 09:08 123.txt
drwxr-xr-x. 2 root root 6 326 2015 rh

5-w:测试当前登录用户是否有写权限

[root@localhost opt]# test -w 123.txt 
[root@localhost opt]# echo $?
0

6-x:测试当前用户是否有执行权限

[czy@localhost opt]$ test -x 123.txt 
[czy@localhost opt]$ echo $?
1

456应用的较少,主要就是123


test比较字符串

-eq等于

-ne不等于

-gt大于

-lt小于

-le小于等于

-ge大于等于

只能用于比较整数,不可以用于字符串

要比较字符串的话

==等于

!=不等于

>:大于 <:小于 >=:大于等于

举个例子

[czy@localhost opt]$ test 56==56
[czy@localhost opt]$ echo $?
0
---------------
[czy@localhost opt]$ test abc == cbd
[czy@localhost opt]$ echo $?
1
---------------
[czy@localhost opt]$ test abc eq cbd
bash: test: eq: 期待二元表达式
这里可以看到只支持整数 

【 条件测试表达式 】

还有一个中括号的方式,下面来看一下

[czy@localhost opt]$ [ -e rh ]
[czy@localhost opt]$ echo $?
0
-------------------
[czy@localhost opt]$ [ -x 123.txt ]
[czy@localhost opt]$ echo $?
1
-------------------
[ 条件测试表达式 ] :括号内内容两边一定要叫空格

中括号跟test效果是一样的,只不过语法不同[]要加空格

【 5 <=4 】 比较数值的时候用英文

==双中括号的功能跟强大,相比于单括号 ==

==可以避免一些歧义 ,支持正则表达式 ==

语法和单括号一致

举个例子

[czy@localhost opt]$ a=3
[czy@localhost opt]$ [[ $a -eq 3 ]]
[czy@localhost opt]$ echo $?
0
----------------------
语法和写法上和单括号一样,也是需要两边加上空格 
但是可以避免歧义 

这里补充一个比较特殊的

-z

[czy@localhost opt]$ a=" "
[czy@localhost opt]$ [ -z $a ]
[czy@localhost opt]$ echo $?
0
--------------------------
[czy@localhost opt]$ a=test
[czy@localhost opt]$ [ -z $a ]
[czy@localhost opt]$ echo $?
1
用来检测字符串是否为空 

逻辑测试

且 条件测试的条件要为真 -a &&

==或 有一边满足即可 -o || ==

! 逻辑否

语法

[ 表达式1 ] 逻辑操作符 [ 表达式2 ]

[czy@localhost opt]$ a=5
[czy@localhost opt]$ [ $a -ne 1 ] && [ $a != 2 ]
[czy@localhost opt]$ echo $?
0
---------------------------
a 不能等于1    且   a 不能等于2 
那么a=5是否满足两边条件
所以echo $? 返回的就是0 
---------------------------
[czy@localhost opt]$ a=5
[czy@localhost opt]$ [ $a -ne 1 -o $a -gt 6 ]
[czy@localhost opt]$ echo $?
0
---------------------------
如果要用 -o 的话 那么这里就不是两个中括号了,要写在一个括号里面  
---------------------------
[czy@localhost opt]$ [ $a -gt 6 -o $a -lt 1 ]
[czy@localhost opt]$ echo $?
1
这里我们可以看到$?返回的是1  因为5 不大于6 也不小于1 两个条件都没有满足 
---------------------------

双括号只能用&& ||表示逻辑且或者逻辑或

单括号只能用 -a 或者-o

意思都是一样的,只不过是语法上有不一样的地方


if语句的结构

1-单分支结构

if []

then

命令序列

fi

[root@localhost opt]# vim 123.sh
----------------
if [ 3 -gt 2 ]
then
  echo "ok"
fi
-----------------
if [ 3 -gt 2 ]; then echo "ok"; fi
----------------
两种写法 ,建议第一种 
----------------
我们现在看一下运行结果 
[root@localhost opt]# sh 123.sh 
ok

2-双分支结构

if [[]]

then

echo"满足if条件执行的语句"

else

echo"不满足if条件执行的语句"

fi

要求有一个IP地址,这个需要用户你手动输入,然后叛断,ping通要保留到/opt/hots.txt
ping不通,打印结果ip地址不可用。
----------------
read -p "请输入一个IP地址" ip
ping -c 5 $ip
if [ $? -eq 0 ]
then
  echo "${ip}可用"
  echo $ip >> /opt/hosts.txt
else
  echo "${ip}不可用"
fi
~       
--------------
[root@localhost opt]# sh 123.sh 
请输入一个IP地址192.168.233.50
PING 192.168.233.50 (192.168.233.50) 56(84) bytes of data.
64 bytes from 192.168.233.50: icmp_seq=1 ttl=64 time=0.035 ms
64 bytes from 192.168.233.50: icmp_seq=2 ttl=64 time=0.050 ms
64 bytes from 192.168.233.50: icmp_seq=3 ttl=64 time=0.061 ms
64 bytes from 192.168.233.50: icmp_seq=4 ttl=64 time=0.054 ms
64 bytes from 192.168.233.50: icmp_seq=5 ttl=64 time=0.092 ms

--- 192.168.233.50 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.035/0.058/0.092/0.020 ms
192.168.233.50可用
--------------
[root@localhost opt]# sh 123.sh 
请输入一个IP地址192.168.233.10
PING 192.168.233.10 (192.168.233.10) 56(84) bytes of data.
From 192.168.233.50 icmp_seq=1 Destination Host Unreachable
From 192.168.233.50 icmp_seq=2 Destination Host Unreachable
From 192.168.233.50 icmp_seq=3 Destination Host Unreachable
From 192.168.233.50 icmp_seq=4 Destination Host Unreachable
From 192.168.233.50 icmp_seq=5 Destination Host Unreachable

--- 192.168.233.10 ping statistics ---
5 packets transmitted, 0 received, +5 errors, 100% packet loss, time 4001ms
pipe 4
192.168.233.10不可用
----------------
现在有1-100这么多数,输入一个数,来判断输入的数是偶数还是奇数
----------------
read -p "请输入一个数字" num
num1=$(( $num%2))

if [ $num1 -eq 0 ]
then
  echo "${nume}是个偶数"
else
  echo "${nume}是个奇数"
fi
---------------
[root@localhost opt]# sh 456.sh
请输入一个数字10
是个偶数
[root@localhost opt]# sh 456.sh
请输入一个数字9
是个奇数

3-多分支结构

if[条件1]

then

执行条件1的命令序列

elif[条件2]

then

执行条件2的命令序列

else

上述都不满足,执行else的命令序列

fi

现在有一个分数值
0-100
大于等于85,小于等于100
优秀
大于等于70 小于等于84
一般
大于等于60 小于等于69
天选之子
上面条件都不满足
寄
------------
read -p "请输入你的分数(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
 echo "$GRADE 分!优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
  echo "$GRADE 分 良好 "
elif [ $GRADE -ge 60 ] && [ $GRADE -le 69 ]
then
echo "$GRADE 分 天选之子"

else
  echo "寄"
fi
~      
-------------        
[root@localhost opt]# sh 789.sh 
请输入你的分数(0-100):80
80 分 良好 
[root@localhost opt]# sh 789.sh 
请输入你的分数(0-100):60
60 分 天选之子
[root@localhost opt]# sh 789.sh 
请输入你的分数(0-100):10
寄
------------

if嵌套

if []

if[]

read -p "请输入你的分数(0-100):" GRADE
if [ $GRADE -eq $GRADE ]  增加条件语句
then
 echo "输入的是一个整数"
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
 echo "$GRADE 分!优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
  echo "$GRADE 分 良好 "
elif [ $GRADE -ge 60 ] && [ $GRADE -le 69 ]
then
echo "$GRADE 分 天选之子"

else
  echo "寄"
fi
else
  echo "输入非法"   
fi
---------
输入的数字大于10
输入的数字比10小
输入的数字和10相等
输入的数字不合法 
--------------
read -p "输入数字" shuzi
if [ $shuzi -eq $shuzi ]
then
echo "输入正确"

if [ $shuzi -gt 10 ]
then
echo "输入的数字大于10"


elif [ $shuzi -lt 10 ]
then
echo "输入的数字小于10"

elif [ $shuzi -eq 10 ]
then
echo "输入的数字等于10"
fi

else
 echo "输入违法"
fi
-------------
[root@localhost opt]# sh abc.sh 
输入数字0
输入正确
输入的数字小于10
[root@localhost opt]# sh abc.sh 
输入数字10
输入正确
输入的数字等于10
[root@localhost opt]# sh abc.sh 
输入数字11
输入正确
输入的数字大于10
[root@localhost opt]# sh abc.sh 
输入数字a
abc.sh: 第 2 行:[: a: 期待整数表达式
输入违法

case语句

case 变量值 in

模式1)

命令序列

;;

模式2)

命令序列

;;

*)

默认命令序列

esac

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早上的星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值