Linux 条件测试语句和if流程控制语句的使用

Read命令

1 定义
Read作用从键盘读入数据,赋给变量

参数用法
read answer	从标准输入读取一行并赋值给变量answer。
read first last	从标准输入读取一行,直至遇到第一个空白符或换行符,
把用户键入的第一个词存到变量first中,把该行的剩余部分保存到变量last中。
read –s passwd 将你输入的东西隐藏起来,值赋给passwd。
read –t 2 test 输入的时间限制。
read –n 2 test 输入的长度限制。
read –r line	允许输入包含反斜杠。

[hadoop@hadoop113 ~]$ read a b c
hello world jsperlee
[hadoop@hadoop113 ~]$ echo $a $b $c
hello world jsperlee

在shell中使用read命令
vi myinfo.sh
#!/bin/bash
read -p “请输入你的姓名:” NAME
read -p “请输入你的年龄:” AGE
read -p “请输入你的性别:” SEX
echo “你的基本信息如下:”
echo “姓名:$ NAME”
echo “年龄:$ AGE”
echo “性别:$SEX”

执行结果
[hadoop@hadoop113 ~]$ sh myinfo.sh
请输入你的姓名:jasperlee
请输入你的年龄:28
请输入你的性别:男
你的基本信息如下:
姓名:jasperlee
年龄:28
性别:男

变量测试语句

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
格式:test 测试条件
如果结果是对的,也叫结果为真,用$ ?=0表示,反之为假,用$?=1表示。

1、文件测试
 参数	         说明	        示例
-e  文件名.	如果文件存在则为真	[ -e file ]
-r  文件名.	如果文件存在且可读则为真	[ -r file ]
-w  文件名.	如果文件存在且可写则为真	[ -w file ]
-x  文件名.	如果文件存在且可执行则为真	[ -x file ]
-s  文件名	.如果文件存在且至少有一个字符则为真	[ -s file ]
-d  文件名.	如果文件存在且为目录则为真	[ -d file ]
-f  文件名.	如果文件存在且为普通文件则为真	[ -f file ]
-c  文件名.	如果文件存在且为字符型特殊文件则为真	[ -c file ]
-b  文件名..	如果文件存在且为块特殊文件则为真	[ -b file ]

案例:

[hadoop@hadoop111 ~]$ test -e clearlog.sh ;echo $ ?
0
[hadoop@hadoop111 ~]$ test -d data/ ;echo $ ?
0
[hadoop@hadoop111 ~]$ test -x lee.sh ;echo $ ?
0
[hadoop@hadoop111 ~]$ chmod 644 ua.sh
[hadoop@hadoop111 ~]$ test -x ua.sh;echo $?
1

 2、数值测试
-eq 等于 应用与整数比较 equal
-ne 不等于 应用与整数比较 not equal
-lt 小于  应用与整数比较 letter
-gt 大于 应用与整数比较 greatter
-le 小于或等于 应用与整数比较
-ge 大于或等于 应用与整数比较

案例:

[hadoop@hadoop111 ~]$ test 2 -gt 1 ;echo $ ?
0
[hadoop@hadoop111 ~]$ test 2 -eq 1;echo $?
1

测试语句另一种常用的使用方法

比如可以省略test写成:[ init1 –lt init2 ],也可以使用最新扩展测试命令语法[[init1 –lt init2]]。
注意:在使用"["简写test时,左中括号后面的空格和右括号前面的空格是必需的,如果没有空格,Shell不可能辨别表达式何时开始何时结束。

数值判断案例:

[hadoop@hadoop111 ~]$ [ 3 -eq 5 ];echo $ ?
1
[hadoop@hadoop111 ~]$ [ 3 < 5 ];echo $ ?
0
[hadoop@hadoop111 ~]$ [[ 3 -eq 5 ]];echo $?
1

文件判断案例:

[hadoop@hadoop111 ~]$ [ -d /etc/hosts ];echo $ ?
1
[hadoop@hadoop111 ~]$ [ -f /etc/hosts ];echo $ ?
0
[hadoop@hadoop111 ~]$ [ -x /etc/hosts ];echo $?
1

提示:“<”和“>””=”分别为小于 大于 等于,并且在[ ]中“<”“>”都要使用转义字符 \ ,在[[ ]]中不需要
3、字符串测试
参数:说明	示例
=  等于则为真	[ “$a” = “$b” ]
!= 不相等则为真	[ “$a” != “$b” ]
-z 字符串:字符串的长度为零则为真	[ -z “$a” ]
-n 字符串:字符串的长度不为空则为真	[ -n “$a” ]

案例:

[hadoop@hadoop111 ~]$ test abc = abc ;echo $ ?
0
[hadoop@hadoop111 ~]$ test abc = ab ;echo $ ?
1
[hadoop@hadoop111 ~]$ test “abc” = “ab c” ;echo $ ?
1
[hadoop@hadoop111 ~]$ lee=""
[hadoop@hadoop111 ~]$ test -z ${lee};echo $ ?
0
[hadoop@hadoop111 ~]$ name=“jasperlee”
[hadoop@hadoop111 ~]$ test -z ${name}; echo $ ?
1
[hadoop@hadoop111 ~]$ test -n ${name};echo $?
0

4、逻辑表达式
||  逻辑或 ;两个条件有一个成立 ,结果为真
&&  逻辑与;仅当两个条件都成立时,结果为真
注:脚本中的逻辑或和逻辑与不能用and和or来表示

案例

[hadoop@hadoop111 ~]$ [ -f /etc/passwd ]&&[ -w /etc/passwd ];echo $ ?
0
[hadoop@hadoop111 ~]$ [ -f /etc/passwd ]&&[ -x /etc/passwd ];echo $ ?
1
[hadoop@hadoop111 ~]$ [ 2 -gt 1 ] || [ 3 -lt 5 ];echo ? 0 [ h a d o o p @ h a d o o p 111   ] ? 0 [hadoop@hadoop111 ~] ?0[hadoop@hadoop111 ] [ 2 -gt 1 ]||[ 8 -lt 5 ];echo $?
0

数值与字符的区别:
数值比较	 字符比较
-eq	     == 等于
-ne	     != 不等于
-gt	     > 大于
-ge	     >=  大于等于
-lt	     < 小于
-le	     <= 小于等于

流程控制–if语句

单分支if语句

语法格式如下:
if 条件   
 then
 语句
fi

在这里插入图片描述

if   条件  ; then
语句
fi
扩展 ;分号,表示两个命令写在一行,互不影响。

案例:

#!/bin/bash

if [ "$USER" != "root" ];then
	echo "当前用户不是ROOT用户"
fi

双分支if语句

语法格式如下:
if  条件1  ; then
    命令1
else
	命令2
fi

在这里插入图片描述
案例:

#!/bin/bash
#检测一个IP通信是否正常
ping -c2 $1 > /dev/null

if [ $? -eq 0 ];then
	echo "Host is up"
else
	echo "Host is down"
fi


#!/bin/bash
#判断一个服务是不是启动状态
service status $1 &> /dev/null

if [ $? -eq 0 ];then
	echo "service $1 is running"
else
	echo "service $1 is stopping"
fi

多分支if语句

更复杂的if语句,语法结构如下
if  条件1  ; then
命令1
elif  条件2  ; then
	命令2:
elif  条件3  ; then
	命令3
……………………
else
	命令n
fi

在这里插入图片描述
案例:

#!/bin/bash

m=man
w=woman

echo "Please input you's sex [man/woman] "
read -p "请输入你的性别:" ss

if  [ "$ss" == "man" ]||[ "$ss" == "MAN" ];then
	echo "你是男人"
elif [ "$ss" == "woman" ]||[ "$ss" == "WOMAN" ];then
	echo "你是女人"
else
	echo "恭喜你!从泰国旅游回来"
fi

扩展—判断

写法一:
if [ 条件判断一 ] && (||) [ 条件判断二 ]; then
命令一
elif [ 条件判断三 ] && (||) [ 条件判断四 ]; then
命令二
else
   执行其它
fi

案例:

#!/bin/bash

read -p "input a file : " filename

if [ -f $filename ]&&[ -w $filename ];then
        echo "Hello world " > $filename
        echo "write success"
else
        echo "$filename not is file"
fi
写法二:
if [[条件判断一 && (||) 条件判断二 ]]; then
elif [[ 条件判断三 && (||) 条件判断四 ]]; then
else
   执行其它
fi

案例:

#!/bin/bash

read -p "请输入要添加的文件名称:" file_name
if [[ -e $file_name && -r $file_name && -w $file_name ]];then
        echo "Hello world,awk" > $file_name
        echo success
else
        echo "$file_name not is a file"
fi
写法三:
if [条件判断一 -a (-o) 条件判断二 ]; then
elif [条件判断三  -a (-o) 条件判断四 ]; then
else
   执行其它
fi

案例:

[hadoop@hadoop111 ~]$ [[ 2 < 3 -a 4 > 5 ]] && echo true || echo false 
-bash: syntax error in conditional expression
-bash: syntax error near `-a'
[hadoop@hadoop111 ~]$ [[ 2 < 3 && 4 > 5 ]] && echo true || echo false
false
[hadoop@hadoop111 ~]$ [ 1 -lt 2 -o b > a ] && echo ok
ok
[hadoop@hadoop111 ~]$  [ 1 -lt 2 -a b > a ] && echo ture|| echo false
ture
[hadoop@hadoop111 ~]$ [[ 1 < 5 || 4 > 5 ]] && echo ture|| echo false
ture

总结

1、所有的字符与逻辑运算符直接用“空格”分开,不能连到一起。
2、在[… ]表达式中,常见的> 、<需要加转义符\,大小比较。
3、进行逻辑运算符&& 、||比较时;如果用的[ ]符号,则用在外面,如[… ] && [… ] || [ …]如果在[…]里面进行逻辑与或,则用-a、-o进行表示,如[ x = y –a x < z –o x > m ]。
4、[[… ]] 运算符只是[… ]运算符的扩充;能够支持< 、>符号运算不需要转义符;它还是以字符串比较大小。里面支持逻辑运算符 || 、 && 不再使用-a 、-o。
5、[[…]] 用 && 而不是 –a 表示逻辑“与”;用 || 而不是 -o表示逻辑“或”。
6、[[… ]]可以进行算术扩展,而[ … ]不可以。
7、[[…]]能用正则,而[…]不行

案例:

[hadoop@hadoop111 ~]$ [ "a.txt" == [a-z].txt ]&& echo ok || echo error
-bash: [: too many arguments
error
[hadoop@hadoop111 ~]$  [[ "a.txt" == [a-z].txt ]]&& echo ok || echo error
ok
[hadoop@hadoop111 ~]$  [ "a.txt" == *.txt ]&& echo ok || echo error
-bash: [: too many arguments
error
[hadoop@hadoop111 ~]$ [[ a.txt == *.txt ]]&& echo ok || echo error
ok
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值