比较文本

当我们比较解析为字符串的元素时,请使用以下比较运算符:

  • = : 字符串 1 匹配字符串 2
  • != : 字符串 1 与字符串 2 不匹配
  • -n : 字符串长度大于 0
  • -z : 字符串长度等于 0
Examples
test "string1" = "string2" && echo "yes" || echo "no"

(在屏幕上显示“no”,因为“string1”不等于“string2”)

test "string1" != "string2" && echo "yes" || echo "no"

(在屏幕上显示“yes”,因为“string1”不等于“string2”)

test -n "string1" && echo "yes" || echo "no"

(在屏幕上显示“yes”,因为“string1”的字符串长度大于零)

test -z "string1" && echo "yes" || echo "no"

(在屏幕上显示“no”,因为“string1”的字符串长度大于零)

不使用test关键字

我们实际上不需要使用单词 test 来执行比较。
我们所要做的就是将语句括在方括号中,如下所示:

[ -e file1.txt ] && echo "file1 exists" || echo "file1 does not exist"

[ 和 ] 基本上与 test 的意思相同。

现在你知道了这一点,你可以通过比较多个条件来改进,如下所示:

[ 4 -eq 4 ] && [ "moo" = "moo" ] && echo "it is a cow" || echo "it is not a cow"
[ -e file1.txt ] || [ -e file1.doc ] && echo "file1 exists" || echo "file1 does not exist"

简单的示例

在终端窗口中尝试这些命令。

test 1 -eq 2 && echo "yes" || echo "no"

上面的命令分解如下:

  • test :执行比较的命令
  • 1 :我们要比较的第一个元素。在此示例中,它是数字 1,但它可以是任何数字,也可以是引号内的字符串。
  • -eq :比较的方法。在这种情况下,我们正在测试一个值是否等于另一个值。
  • 2 :我们要与第一个元素进行比较的元素。在这个例子中,它是数字 2.
  • && :按顺序将命令链接在一起的 Linux 快捷方式。测试链的输出到随后的命令。当它前面的命令的退出状态为 0 时,双 & 号就会执行,这是一种表示命令没有失败的奇特方式。
  • echo "yes" :比较成功时运行的命令。在这种情况下,我们所做的只是要求 echo 命令将单词“yes”打印到标准输出,但是我们可以在此处运行任何命令,如果测试结果证明为真,则会执行该命令。
  • || :在某种程度上,与&&相反;双管道仅在它之前的命令失败时才执行(退出状态不为 0)。
  • echo "no" :比较失败时运行的命令。

从 shell 提示符运行,test 不会向标准输出返回值,它仅返回退出状态代码。
这就是链接 echo 命令是必要的原因。

本质上,该命令是将 1 与 2 进行比较,如果它们匹配,则执行 echo "yes" 语句,显示 "yes",如果不匹配,则执行 echo "no" 语句,显示 "no"。

如何在 Bash 脚本中使用测试条件

Linux test命令将一个元素与另一个元素进行比较,但它更常用于 BASH shell 脚本中,作为控制逻辑和程序流程的条件语句的一部分。

比较数字

如果要比较解析为数字的元素,可以使用以下比较运算符:

  • -eq : 值 1 等于值 2
  • -ge : 值 1 大于或者等于值 2
  • -gt : 值 1 大于值 2
  • -le : 值 1 小于或者等于值 2
  • -lt : 值 1 小于值 2
  • -ne : 值 1 不等于值 2

test示例

test 1 -eq 2 && echo "yes" || echo "no"

(在屏幕上显示“no”,因为 1 不等于 2)

test 1 -ge 2 && echo "yes" || echo "no"

(在屏幕上显示“no”,因为 1 不大于或者等于 2)

test 1 -gt 2 && echo "yes" || echo "no"

(在屏幕上显示“no”,因为 1 不大于 2)

test 1 -le 2 && echo "yes" || echo "no"

(在屏幕上显示“yes”,因为 1 小于或者等于 2)

test 1 -lt 2 && echo "yes" || echo "no"

(在屏幕上显示“yes”,因为 1 小于或者等于 2)

test 1 -ne 2 && echo "yes" || echo "no"

(在屏幕上显示“yes”,因为 1 不等于 2)

比较文件

比较文件时,请使用以下比较运算符:

  • -ef :文件具有相同的设备和 inode 编号(它们是同一个文件)
  • -nt : 第一个文件比第二个文件新
  • -ot : 第一个文件比第二个文件旧
  • -b :文件存在并且是块特殊的
  • -c : 文件存在并且是特殊字符
  • -d : 文件存在并且是一个目录
  • -e : 文件存在
  • -f : 文件存在并且是一个普通文件
  • -g : 文件存在并具有指定的组号
  • -G : 文件存在且属于用户组
  • -h 或者 -L :文件存在并且是一个符号链接
  • -k :文件存在并设置了粘滞位
  • -O : 文件存在你是所有者
  • -p :文件存在并且是命名管道
  • -r :文件存在且可读
  • -s :文件存在且大小大于零
  • -S : 文件存在并且是一个套接字
  • -t :文件描述符在终端上打开
  • -u : 文件存在并且设置了 set-user-id 位
  • -w :文件存在且可写
  • -x :文件存在且可执行

示例

test /path/to/file1 -nt /path/to/file2 && echo "yes"

(如果文件 1 比文件 2 新,则将显示“yes”)

test -e /path/to/file1 && echo "yes"

(如果文件 1 存在,将显示“yes”)

test -O /path/to/file1 && echo "yes"

(如果我们拥有 file1,则显示“yes”)

块特殊:文件是块设备,这意味着数据以字节块读取。
这些通常是设备文件,例如硬盘驱动器。

特殊字符:当我们写入文件时会立即对其进行操作,并且通常是一个设备,例如串行端口

比较多个条件

要同时测试两个条件,请使用以下语句:

test 4 -eq 4 -a "moo" = "moo" && echo "it is a cow" || echo "it is not a cow"

这里的关键部分是 -a 标志,它代表 逻辑与。

有一种更好且更常用的方法来执行相同的测试,如下所示:

test 4 -eq 4 && test "moo" = "moo" && echo "it is a cow" || echo "it is not a cow"
日期:2020-07-15 11:16:38 来源:oir作者:oir