Shell 比较大小

数值用字母命令,字符串比较用数学符号

整数比较

-eq 等于,如:if [ “$a” -eq “$b” ]

-ne 不等于,如:if [ “$a” -ne “$b” ]

-gt 大于,如:if [ “$a” -gt “$b” ]

-ge 大于等于,如:if [ “$a” -ge “$b” ]

-lt 小于,如:if [ “$a” -lt “$b” ]

-le 小于等于,如:if [ “$a” -le “$b” ]

< 小于(需要双括号),如:((“$a” < “$b”))

<= 小于等于(需要双括号),如:((“$a” <= “$b”))

> 大于(需要双括号),如:((“$a” > “$b”))

>= 大于等于(需要双括号),如:((“$a” >= “$b”))

字符串比较

= 等于,如:if [ “$a” = “$b” ]

== 等于,如:if [ “$a” == “$b” ],与=等价

注意: [[]]和[]中的行为在某些情况下是不同的:

[[ $a == z* ]]           # 如果$a 以”z”开头(模式匹配)那么将为true

[[ $a == “z*” ]]         # 如果$a 等于z*  (字符匹配),那么结果为true

[ $a == z* ]             # File globbing 和word splitting 将会发生

[ “$a” == “z*” ]        # 如果$a 等于z* (字符匹配),那么结果为true

File globbing 是一种关于文件的速记法,比如”*.c”就是,再如~也是.

但是file globbing 并不是严格的正则表达式,虽然绝大多数情况下结构比较像.

(笔者不太懂, 假如在/tmp目录下有一个a.txt文件,则[ “a.txt” = a.* ]会返回逻辑真,但如果/tmp下有a.txt和a.out两个文件,则这样写Shell会报错)

!= 不等于,如:if [ “$a” != “$b” ]

注意:!= 在[[]]结构中使用模式匹配.

< 小于,在ASCII 字母顺序下.如:

if [[ “$a” < “$b” ]]

if [ “$a” \< “$b” ]

注意:在[]结构中”<“需要被转义.

> 大于,在ASCII 字母顺序下.如:

if [[ “$a” > “$b” ]]

if [ “$a” \> “$b” ]

注意:在[]结构中”>”需要被转义.

-z 字符串为空.就是长度为0.

-n 字符串不为空

注意: 对于字符串或数字的比较, 加上双引号(“”)是没有坏处的, 而且能避免一些不必要的麻烦(请参考,但模式和正则表达式不能加双引号.

混合比较

-a 逻辑与

exp1 -a exp2     如果exp1 和exp2 都为true 的话,这个表达式将返回true

-o 逻辑或

exp1 -o exp2    如果exp1 和exp2 中有一个为true 的话,那么这个表达式就返回true

但在[[]]使用&&和|| 代替-a 和-o,  -o 和-a 一般都是搭配test 命令或者[]

百度大模型

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

腾讯云图