返回

Shell中[ ]条件语句的真相:为什么它不能比较大小?

见解分享

揭开shell中[ ]条件语句的真相:为什么它不能比较大小?

当我们写shell脚本时,不可避免地会用到条件语句来控制程序的执行流程。其中,[ ]条件语句因其简洁易用而受到广泛青睐。然而,你可能不知道的是,[ ]条件语句在比较大小方面存在一个意想不到的限制。

[ ]条件语句的真实面目

乍一看,[ ]条件语句似乎是一个用于比较的语法结构。例如,我们经常使用以下代码来比较两个变量是否相等:

if [ "$var1" = "$var2" ]; then
  echo "Variables are equal."
fi

但实际上,[ ]并不是一个语法,而是一个独立的命令行程序。它检查其参数的真伪值,并返回一个相应的状态码。在上面的示例中,[ "var1" = "var2" ]会执行以下操作:

  1. 将变量var1和var2的值作为参数传递给[ ]命令。
  1. [ ]命令比较两个参数,并返回一个状态码:
    • 如果参数相等,返回0(真)。
    • 如果参数不等,返回1(假)。

为什么[ ]条件语句不能比较大小?

现在,让我们回到[ ]条件语句不能比较大小的原因。这是因为[ ]命令本身不支持大小比较运算。它只能检查相等性、不等性以及文件和目录是否存在等基本条件。

要理解这一点,我们可以看看[ ]命令的帮助文档:

$ man test
...
TEST(1)                BSD General Commands Manual               TEST(1)

NAME
     test - file and string evaluation

SYNOPSIS
     test [expr]

DESCRIPTION
     If  no  arguments  are  provided,  test  succeeds  if  the  standard
     input  is  valid (ie., not empty).  Otherwise, it evaluates the expres-
     sion  provided,  which is an expression of the form `expr'.  The for-
     mats of the expression are:
...

正如帮助文档所述,test命令的表达式主要用于检查文件和字符串的条件,并没有提供大小比较运算符。

替代方案:使用数值比较运算符

既然[ ]条件语句不能比较大小,那我们该如何在shell脚本中进行数值比较呢?答案是使用数值比较运算符,如:

  • -eq:相等
  • -ne:不等
  • -gt:大于
  • -ge:大于等于
  • -lt:小于
  • -le:小于等于

这些运算符可以与shell的算术表达式一起使用,从而实现复杂的数值比较。例如,以下代码比较两个变量是否相等:

if (( "$var1" == "$var2" )); then
  echo "Variables are equal."
fi

总结

虽然[ ]条件语句在shell脚本中很常用,但它不能用于比较大小。要进行数值比较,我们需要使用数值比较运算符和算术表达式。通过了解这些限制并使用适当的替代方案,我们可以写出健壮且高效的shell脚本。