当前位置: 首页 > Linux

bash技巧:列举bash中用于判断的各种条件表达式

时间:2023-04-06 02:46:31 Linux

在bash中,条件表达式(Conditionalexpressions)用于一些判断。比如判断文件是否存在,字符串是否相等,比较值的大小等等。查看manbash的CONDITIONALEXPRESSIONS部分,对条件表达式的解释如下:以下一元或二元初选。当与[[一起使用时,<和>运算符使用当前语言环境按字典顺序排序。测试命令使用ASCII排序进行排序。即[[复合命令、test内置命令、[内置命令使用条件表达式来判断文件属性、进行字符串比较、进行算术比较。在CONDITIONALEXPRESSIONS部分,列出了很多条件表达式,常用的条件表达式介绍如下。判断文件属性的条件表达式判断文件属性的条件表达式如下表所示。条件表达式含义-afile如果file文件存在则返回true,否则返回false-dfile如果file文件存在且是目录则返回true,否则返回false-efile与-afile含义相同,如果文件存在file如果存在,返回true-ffile如果文件file存在,并且是文本文件,返回true,否则返回false-sfile如果文件file存在,并且文件大小大于0,返回true,否则返回false-Nfile如果文件file存在,并且读取后被修改,返回true,否则返回falseotfile2如果file1的修改时间早于file2,或者file2存在但file1不存在,返回true如果给定的文件名本身有空格,必须用引号括起来,否则会出现意想不到的结果。注意:在bash中,true对应的值为0,false对应的值为1。这些条件表达式的例子如下:$test-atestfile;echo$?0$测试-d测试文件;echo$?1$测试-e测试文件;echo$?0$测试-f测试文件;echo$?0$测试-s测试文件;echo$?0$测试-N测试文件;echo$?0$test测试文件-ntretestfile;echo$?0$test测试文件-otretestfile;回声$?1这里使用test命令进行测试,该命令会返回条件表达式的返回值,然后使用echo$?打印上一条命令的返回值,可以看到返回结果。可以看到,test-atestfile命令返回0,即true,testfile文件存在。test-dtestfile命令返回false,testfile文件不是目录。test-etestfile命令同样判断文件是否存在,返回true。test-ftestfile命令返回true,testfile文件为文本文件。test-stestfile命令返回true,testfile文件大小大于0,即不为空。可以使用-s文件条件表达式判断文件内容是否为空。test-Ntestfile命令返回true,表示自上次读取testfile后,该文件又被修改过。您可以使用-N文件条件表达式来确定文件是否已更改。比如要实现一个版本管理系统,如果要查看仓库中的文件是否有变化,可以这样简单的判断。testtestfile-ntretestfile命令返回true,testfile文件的修改时间比retestfile文件更新。可以通过file1-ntfile2判断不同目录下的文件是否有更新。比如在实际工作中,项目代码是由多人共同维护和开发的。我们可能只修改其中的几个文件并在本地备份。那么我们就可以通过这个条件表达式来判断项目代码文件是否比本地备份文件新。如果是,请备份。如果在项目代码中加入了新的文件,也可以判断为本地没有备份该文件。testtestfile-otretestfile命令返回false,testfile比retestfile更早被修改。可以通过file1-otfile2来判断不同目录下的文件是否有更新。具体使用场景类似于file1-ntfile2。判断字符串的条件表达式判断字符串的条件表达式如下表所示。条件表达式含义-zstring如果字符串的长度为0,则返回true,否则返回false-nstring如果字符串的长度不为0,则返回true,否则返回falsestring的含义与-nstring,如果string长度不为0,返回truestring1=string2如果给定的两个字符串相等,返回true,否则返回falsestring1==string2如果给定的两个字符串相等,返回true,否则返回falsestring1!=string2如果给定两个字符串不相等,返回真,否则返回假string1string2如果string1在字典序上晚于string2字符串,返回真,否则返回false可以看到判断字符串的条件表达式不支持>=,<=操作符。在实际编写以下五个比较字符串的条件表达式时,有一些需要注意的地方。在bash中,<和>字符是重定向操作符。因此,在写string1string2这两个条件表达式时,需要使用\转义符或引号来去掉<和>的特殊含义,否则会报错。具体例子如下:$testa运算符的左右两边必须用空格隔开,不能写成string=string2、string1来比较整数,但这两个运算符实际上是将整数作为字符串进行比较。Bash的数据类型是弱类型的,因此1可以是整数或字符串,具体取决于上下文。具体例子如下:$test1'>'2;echo$?1$test1'>='2-bash:test:>=:binaryoperatorexpected可以看到,命令test1'>'2返回1,判断结果正确。这其实就是一个判断字符串的条件表达式。但是test1'>='2命令会报错,因为判断字符串的条件表达式不支持>=运算符。也不支持<=运算符。刚接触test命令时,一个常见的误解是认为条件表达式可以使用>=、<=运算符。注意:在测试命令和[命令中使用<和>运算符会将字符串与ASCII编码值进行比较。在ASCII编码中,数字1到9的编码值是递增的。基于这种字典顺序,可以使用<和>运算符来比较数字字符串的大小关系。在[[命令中使用<和>运算符将使用当前语言环境编码集的编码值来比较字符串。例如UTF8、GBK等。如果在一个编码集中,数字1到9的编码值不是递增顺序,用<和>运算符比较数字串的大小关系会得到错误的结果。例如,当数字1的编码值大于数字2的编码值时,[[1>2]]命令返回true。建议不要使用<、>运算符来比较数字。条件表达式不支持AND或NOT运算符。在CONDITIONALEXPRESSIONS部分描述的条件表达式中,没有描述逻辑AND、逻辑OR和逻辑NOT的表达式。即条件表达式本身不支持AND、OR、NOT运算符。评估条件表达式的命令本身支持AND、OR和NOT运算符,具体支持的运算符各不相同。例如,测试命令使用-o作为OR运算符。而[[命令使用&&作为OR运算符。