bash shell逻辑表达式的使用

 更新时间:2023年05月09日 14:31:31   作者:不识君  
bash shell逻辑表达式一般有3种写法,本文就来介绍一下bash shell逻辑表达式的具体使用,具有一定的参考价值,感兴趣的可以了解一下

前言

控制语句需要逻辑表达式进行分支判断,bash shell逻辑表达式一般有3种写法:test expression[ expression ][[ expression ]]

test

test命令的使用格式是:test expression。expression就是我们的逻辑表达式,如果值为true,执行这条命令的返回值为0,false则非0。示例:

#! /bin/bash
#1 == 1
test 1 -eq 1
echo "1 == 1 : $?"
#1 == 2
test 1 -eq 2
echo "1 == 2 : $?"

执行结果:

注意,test命令对于值的比较有固定的写法(毕竟是个命令),主要分为3种:数值比较、字符串比较、文件类型检查。

数字比较

数字的比较不能用== 、!=、<、>这些符号比较,有固定的参数,就像上面的示例一样,1==1,要写成1 -eq 1,下面作个说明:

p.s. 如果记不住,可以用man test查看,下面是执行man test中关于数值比较的说明部分:

       INTEGER1 -eq INTEGER2
INTEGER1 is equal to INTEGER2

       INTEGER1 -ge INTEGER2
INTEGER1 is greater than or equal to INTEGER2

       INTEGER1 -gt INTEGER2
INTEGER1 is greater than INTEGER2

       INTEGER1 -le INTEGER2
INTEGER1 is less than or equal to INTEGER2

       INTEGER1 -lt INTEGER2
INTEGER1 is less than INTEGER2

       INTEGER1 -ne INTEGER2
INTEGER1 is not equal to INTEGER2

使用示例:test integer1 -eq integer2:比较integer1等于integer2,其它例同

字符串比较

字符串比较,可以用=或!=这些符号,另外还有一些非空检查的选项,如下从(man test就看到了)复制过来的,加了点说明:

       -n STRING :字符串的长度大于0
the length of STRING is nonzero

       -z STRING:字符串的长度为0
the length of STRING is zero

上面的2项,可以对字符串是否为空字符串判断,如果字符串为空(不是空字符串),无论是-n还是-z都是true

       STRING1 = STRING2
the strings are equal

       STRING1 != STRING2
the strings are not equal

示例:

#! /bin/bash
str1="str1"
test -n $str1;echo $?
test -z $str2;echo $?
test -n $str2;echo $?
test x$str2 = x;echo $?
test $str1 != "";echo $?

执行结果(都是true):

文件比较、类型/属性检查

下面就不过多解释了,每个选项的描述很清楚了,也不需要刻意去记每个选项,还是那句话:man test,

       FILE1 -ef FILE2
FILE1 and FILE2 have the same device and inode numbers

       FILE1 -nt FILE2
FILE1 is newer (modification date) than FILE2

       FILE1 -ot FILE2
FILE1 is older than FILE2

       -b FILE
FILE exists and is block special

       -c FILE
FILE exists and is character special

       -d FILE
FILE exists and is a directory

       -e FILE
FILE exists

       -f FILE
FILE exists and is a regular file


-g FILE
FILE exists and is set-group-ID

       -G FILE
FILE exists and is owned by the effective group ID

       -h FILE
FILE exists and is a symbolic link (same as -L)

       -k FILE
FILE exists and has its sticky bit set

       -L FILE
FILE exists and is a symbolic link (same as -h)

       -O FILE
FILE exists and is owned by the effective user ID

       -p FILE
FILE exists and is a named pipe

       -r FILE
FILE exists and read permission is granted

       -s FILE
FILE exists and has a size greater than zero

       -S FILE
FILE exists and is a socket

       -t FD  file descriptor FD is opened on a terminal

       -u FILE
FILE exists and its set-user-ID bit is set

       -w FILE
FILE exists and write permission is granted

       -x FILE
FILE exists and execute (or search) permission is granted

示例:

#! /bin/bash
#文件是否存在
test -e demo.sh
echo "demo.sh exists: $?"
test -e demo1.sh
echo "demo1.sh exists: $?"

执行结果:

逻辑与:-a,逻辑或:-o

因为test是个命令,所以逻辑与/或不能像其它语言一样使用&&、||等符号,这几个符号在shell中可是有特殊的意义,比如上面示例,用&&连接两条命令,每1条执行成功,才会执行下一条。

示例:

#! /bin/bash
#1等于1并且1等于2
test 1 -eq 1 -a 1 -eq 2
echo "1 == 1 && 1 == 2: $?"
#1等于1或者1等于2
test 1 -eq 1 -o 1 -eq 2
echo "1 == 1 || 1 == 2: $?"

执行结果:

[命令

注意是“[”,这是个命令,写法一般是[ expression ],注意expression前后的空格,“[”可不是个符号, 是个命令,等同于test的命令,所以它的expression,和test的用法一样。

这里重点是“[”是个命令,所以[,]这两个符号和表达式之前要注意空格,另外,既然是和test一样的命令,逻辑与不能&符号连接,也要用-a等连接:

#! /bin/bash
#1等于1并且1等于2
[ 1 -eq 1 -a 1 -eq 1 ] 
echo "1 == 1 && 1 == 2: $?"
#1等于1或者1等于2
[ 1 -eq 1 -o 1 -eq 1 ] 
echo "1 == 1 || 1 == 2: $?"

执行结果:

[[ expression ]]

虽然"[["只比"[",多了一个"[",但是含义却是不一样的,"["是一个命令,而"[["却是一个关键字。

不过[[ expression ]]的功能却比[ expression ]要强大不少,是[ expression ]的增强版。比如[[ expression ]]可以用&&作为逻辑与连接符而不支持用-a,同理逻辑或是||,但不支持-o。除此,其它的基本都兼容,另外[[ expression ]][ expression ],还有一些其它能力的支持,比如使用<,>等这些比较数字,但是因为"["是个命令,所以并不支持(需要转义)。

所以,在感觉上来说使用[[ expression ]]更符合编程习惯,如下:

#! /bin/bash
#数字计算比较,
[[ 5 < $((3+3)) && 4 >3 ]]
echo "[[ 5 < 3+3 && 4 >3 ]] : $?"
#使用[],就不支持,运行到这里就报错了
[ 5 < $((3+3)) && 4 >3 ]

执行结果:

可以看到第7行代码执行不通过,所以用[]的写法就该是这样:[ 5 -lt $((3+3)) -a 4 -gt 3 ]

到此这篇关于bash shell逻辑表达式的使用的文章就介绍到这了,更多相关shell逻辑表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Linux Bash 提示符的一些骚操作(自定义 Bash 提示符)

    Linux Bash 提示符的一些骚操作(自定义 Bash 提示符)

    这篇文章主要介绍了Linux Bash 提示符的一些骚操作,一些能让你自定义 Bash 提示符的黑科技,需要的朋友可以参考下
    2017-07-07
  • Shell脚本中获取命令运行结果的实现

    Shell脚本中获取命令运行结果的实现

    本文主要介绍了Shell脚本中获取命令运行结果的实现,除了我们熟知的管道 | 和args,我们也可以通过获取命令的运行结果,本文就来介绍一下,感兴趣的可以了解一下
    2023-10-10
  • 浅谈Vim中的Tab与空格缩进

    浅谈Vim中的Tab与空格缩进

    下面小编就为大家带来一篇浅谈Vim中的Tab与空格缩进。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 检测网站down掉后自动发信的shell脚本代码

    检测网站down掉后自动发信的shell脚本代码

    脚本用途:检测指定文件中的网站url,当一个网站down掉后,自动给指定的邮箱发信
    2013-02-02
  • 脚本批量检测网站是否存活

    脚本批量检测网站是否存活

    这篇文章主要介绍了批量检测网站是否存活的脚本,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Shell命令解释器分类示例详解

    Shell命令解释器分类示例详解

    Shell是负责User与Linux OS之间沟通的桥梁,Shell为用户提供了一个操作界面,User在这个界面输入指令,其实就是通过Shell向Linux Kernel传递过去,这也就是为什么Shell也叫解释器的原因,这篇文章主要给大家介绍了关于Shell命令解释器分类的相关资料,需要的朋友可以参考下
    2023-05-05
  • shell脚本学习指南[三](Arnold Robbins & Nelson H.F. Beebe著)

    shell脚本学习指南[三](Arnold Robbins & Nelson H.F. Beebe著)

    这篇文章主要介绍了shell脚本学习指南[三](Arnold Robbins & Nelson H.F. Beebe著),需要的朋友可以参考下
    2014-02-02
  • linux 检测远程端口是否打开方法总结

    linux 检测远程端口是否打开方法总结

    这篇文章主要介绍了linux 检测远程端口是否打开方法总结的相关资料,需要的朋友可以参考下
    2017-04-04
  • shell脚本--sed的用法详解

    shell脚本--sed的用法详解

    这篇文章主要介绍了shell脚本--sed的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 通过Spring Shell 开发 Java 命令行应用

    通过Spring Shell 开发 Java 命令行应用

    这篇文章主要介绍了通过Spring Shell 开发 Java 命令行应用的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11

最新评论