比较文本
当我们比较解析为字符串的元素时,请使用以下比较运算符:
- = : 字符串 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"。
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"