条件测试
条件测试格式
测试表达式是否成立,若成立
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 9月 18 09:08 123.txt
drwxr-xr-x. 2 root root 6 3月 26 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