查看原文
其他

Shell基础(9)-条件判断2

Cloud研习社 Cloud研习社 2023-06-06


每周二、四、六定期更新!



字符串判断



  • 判断是否为空字符串
格式:-z string
如果字符串为空,则为真;如果字符串不为空则为假。例如:
[root@studyclub jason]# [ -z MYNAME ]
[root@studyclub jason]# echo $? # MYNAME作为字符串,这显然不是一个空字符串,所以返回为假
1
[root@studyclub jason]# [ -z "$MYNAME" ]
[root@studyclub jason]# echo $? # 我们看MYNAME这个变量是不是空的、没有内容的。我们没有定义MYNAME这个变量,所以为空,故返回为真。
0


  • 判断是否为非空字符串

格式:-n string
如果字符串不为空,则为真;如果字符串为空,则为假。例如:
[root@studyclub jason]# [ -n MYNAME ]
[root@studyclub jason]# echo $? # MYNAME是一个字符串,不为空,所以返回真
0
[root@studyclub jason]# [ -n "$MYNAME" ]
[root@studyclub jason]# echo $? # 我们没有定义MYNAME这个变量,所以为空,故返回为假
1

#
 重点:我们也可省略-n选项,如果为空则返回假,如果不为空则返回为真
[root@studyclub ~]# [ "$MYNAME" ]
[root@studyclub ~]# echo $?
1
[root@studyclub ~]# MYNAME=jaso # 我们把MYNAME变量定义上
[root@studyclub ~]# [ "$MYNAME" ] # 判断变量内容是否为空
[root@studyclub ~]# echo $? # 非空,返回真
0


判断字符串是否相等(字符串是否相同)
[ STRING1 = STRING2 ]    # 判断字符串相等吗?相等则返回true(0),不相等则返回false(1)
[ STRING1 != STRING2 ]    # 判断字符串是否不相等?不相等则返回true(0),相等则返回false(1)
[ STRING1 < STRING2 ]    # (不常用)判断字符串STRING1是否小于STRING2(根据ASCII码比较),如果是则返回true(0),如果不是则返回false(1)
[ STRING1 > STRING2 ]    # (不常用)判断字符串STRING1是否大于STRING2(根据ASCII码比较),如果是则返回true(0),如果不是则返回false(1)


实例:
[root@studyclub jason]# str1=jason
[root@studyclub jason]# str2=studyclub
[root@studyclub jason]# [ $str1 = $str2 ] # 判断两个字符串是不是相等,我们的例子显然不相等,所以这一步返回false(1)
[root@studyclub jason]# echo $?
1
[root@studyclub jason]# [ $str1 != $str2 ] # 我们例子中的两个字符串显然不相等,所以返回true(0)
[root@studyclub jason]# echo $?
0

[root@studyclub jason]# str1=studyclub # 让两个变量的内容相等
[root@studyclub jason]# [ $str1 = $str2 ] # 判断是否相等
[root@studyclub jason]# echo $? # 相等,返回true(0)
0


双中括号"[[]]"的用法。

使用“==”和“!=”的时候,符号的右边可以有通配符

使用“=~”的时候,符号的右边可以使用正则表达式(正则表达式的内容我们后面讲解)


# 判断一下文件名是不是以.txt结尾
[root@studyclub jason]# file=test.txt
[root@studyclub jason]# [[ $file == *.txt ]] # 第一个方式,取变量的时候不加引号
[root@studyclub jason]# echo $?
0
[root@studyclub jason]# [[ "$file" == *.txt ]] # 第二种方式,取变量的时候加引号,我们推荐这种方式。
[root@studyclub jason]# echo $?
0

# 不等号“!=”的练习
[root@studyclub jason]# [[ "$file" != *.txt ]]
[root@studyclub jason]# echo $? # 我们的文件名后缀是.txt,所以返回false(1)
1
[root@studyclub jason]# [[ "$file" != *.pdf ]]
[root@studyclub jason]# echo $? # 我们的文件名后缀是.txt,确实不等于.pdf,所以返回true(0)
0


我们再来看看“=~”符号的用法:

# 接上例
[root@studyclub jason]# [[ "$file" =~ \.pdf$ ]] # 文件是不是以.pdf结尾?不是,返回false(1)
[root@studyclub jason]# echo $?
1
[root@studyclub jason]# [[ "$file" =~ \.txt$ ]] # 文件是不是以.txt结尾?是,返回true(0)
[root@studyclub jason]# echo $?
0


这种判断文件结尾的用法,可以用在脚本中,比如我们需要给所有的脚本加上可执行权限,那么我们就可以用这种方法来判断文件是否以.sh结尾,如果是,那就给他加可执行权限。我们再来看一个例子:
# 判断变量的值是不是数字:
[root@studyclub jason]# NUM=100
[root@studyclub jason]# [[ "$NUM" =~ ^[0-9]+$ ]] # 判断所有的值是否都在是0-9之间的数字。
[root@studyclub jason]# echo $? # 是数字0-9,则返回true(0)
0
[root@studyclub jason]# NUM=1B00
[root@studyclub jason]# [[ "$NUM" =~ ^[0-9]+$ ]]
[root@studyclub jason]# echo $? # NUM变量的内容中有个字母B,不属于0-9,所以会返回false(1)
1

# 简单判断ip地址的合法性(不做数值的检验,制作数字和位数的检验)
[root@studyclub jason]# IP=10.0.0.1
[root@studyclub jason]# [[ "$IP" =~ ^([0-9]{1,3}.){3}[0-9]{1,3}$ ]]
[root@studyclub jason]# echo $? # 都是数字,且每一个段的数字位数在3位以内
0


手应知:

    尝鲜Rocky Linux

《Linux基础及进阶》:

    052 - Shell基础(4)-变量的有效范围、位置变量
    053 - Shell基础(5)-退出状态码
    054 - Shell基础(6)-set命令实现脚本安全
    055 - Shell基础(7)-算术运算
   056 - Shell基础(8)-算术运算、条件判断1


看完本文有收获?请分享给更多人


推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!

微信号|bjdream-1


Cloud研习社 · 




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存