Redian新闻
>
教你如何在 Bash 脚本中使用强大的 Linux test 命令

教你如何在 Bash 脚本中使用强大的 Linux test 命令

公众号新闻

来自:Linux迷链接:https://www.linuxmi.com/bash-linux-test-command.html

Linux test 命令是 Shell 内置命令,用来检测某个条件是否成立。test 通常和 if 语句一起使用,并且大部分 if 语句都依赖 test。可以将一个元素与另一个元素进行比较,但它更常用于BASH shell 脚本中,作为控制逻辑和程序流程 的条件语句的一部分。
test 命令有很多选项,可以进行数值、字符串和文件三个方面的检测。


一个基本的例子


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


linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                   ⚡ test 1 -eq 2 && echo "yes" || echo "no"no
linuxmi@linuxmi /home/linuxmi/www.linuxmi.com ⚡ test 1 -eq 1 && echo "yes" || echo "no"yes


上面的命令分解如下:


    • 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”。


比较数字


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


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

示例测试

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)


比较文本


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


  • =:字符串 1 匹配字符串 2
  • != : 字符串 1 与字符串 2 不匹配
  • -n:字符串长度大于0
  • -z:字符串长度等于 0

例子


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”的字符串长度大于零)


比较文件


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


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


例子


⚡ test linuxmi -nt linux && echo "yes"


(如果 linuxmi 比 linux 新,则显示“yes”字样,如上图)


⚡ test -e /home/linuxmi/linuxmi && echo "yes"


(如果 linuxmi 存在,将显示“yes”)


test -O /home/linuxmi/linuxmi && echo "yes"


(如果您拥有 file1,则显示“yes”字样”)
块特殊:文件是块设备,这意味着数据以字节块的形式读取。这些通常是设备文件,例如硬盘驱动器。
特殊字符:文件在您写入时立即执行,通常是串行端口等设备

比较多个条件


到目前为止,一切都在将一件事与另一件事进行比较,但是如果您想比较两个条件怎么办?
例如,如果一只动物有四条腿并且会发出“哞哞”的声音,它可能是一头奶牛。简单地检查四只腿并不能保证你有一头牛,但检查它发出的声音肯定可以。
要同时测试这两个条件,请使用以下语句:


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


这里的关键部分是-a标志,它代表and


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


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




test 命令的分支很重要。如果第一个测试 (4 = 4) 失败,则 test 命令以非零退出代码终止。因此,我们跳转到双管道符号并且“it is not a cow”打印到标准输出。但是,如果第一个测试成功并因此 test 导致退出代码0,那么我们跳转到第一个双与号(&&)。下一条语句是另一个测试条件!
如果第二次 test 失败,我们再次跳到双管并从那里继续。然而,如果第二个 test 成功,我们跳转到第二个双& 语句,在这个例子中,它只是将“it is a cow”回显到标准输出,然后终止返回到 shell 提示符。
另一个测试比较两个语句,如果其中一个为真,则输出一个字符串。例如,要检查是否存在名为“linuxmi.txt”的文件或名为“linuxmi.py”的文件,可以使用以下命令:
这里的关键部分是-o代表or


test -e linuxmi.txt -o -e linuxmi.py && echo "linuxmi exists" || echo "linuxmi does not exist"




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


test -e linuxmi.txt || test -e linuxmi.py && echo "linuxmi exists" || echo "linuxmi does not exist"



排除 test 关键字


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


⚡ [ -e linux.py ] && echo "linux.py exists" || echo "file1 does not exist"linux.py exists

[and]基本上与test含义 相同
现在您知道这一点,您可以改进比较多个条件,如下所示:


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



总结


test 命令在脚本中更有用,因为您可以对照另一个变量测试一个变量的值并控制程序流程。在命令行上,使用它来测试文件是否存在。

END

官方站点:www.linuxprobe.com

Linux命令大全:www.linuxcool.com

刘遄老师QQ:5604215

Linux技术交流群:2636170

(新群,火热加群中……)

想要学习Linux系统的读者可以点击"阅读原文"按钮来了解书籍《Linux就该这么学》,同时也非常适合专业的运维人员阅读,成为辅助您工作的高价值工具书!


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
第四章第一节 仇外自大的民族主义请问自己高中不提供的 AP test, 怎么自己找到考点儿考?UOS 将推 Rust 版 Bash 命令行工具utshell,支持防篡改、防溢出如何将 Silverblue 重定位到 Fedora Linux 39 | Linux 中国我们的一年(14)穿越死亡谷Bcachefs已被合并到Linux-Next,Linux 6.7有望引入第四章第四节 三民主义和近代中国如何制作一个 Linux Mint 立付 USB | Linux 中国Fractal 5:Linux Matrix 消息应用迎来 GTK 4 和 Rust SDK 的升级 | Linux 中国Linux Lite 6.6 发布:更新了欢迎应用和图标主题 | Linux 中国Vojtux:针对视力障碍用户改造 Linux | Linux 中国首款 Linux 游戏本?!Tuxedo 推出 Linux 游戏本 Sirius 16使用 Btrfs 快照方便升级 Fedora Linux 且易于回退 | Linux 中国在基于 Arm 的 Thinkpad X13S 笔记本上运行 Linux | Linux 中国Canonical 告诉你如何不通过 Snap 商店使用 Snap 包 | Linux 中国在 Linux 文件系统中使用 attr 添加扩展属性 | Linux 中国Linux 游戏的下一个秘密武器:Bottles Next | Linux 中国使用 dialog 和 jq 在 Linux 上编写高效终端 TUI | Linux 中国TB test 显示阳性,胸片没问题,需要治疗还是等等看?运维必须收藏!常用的570个Linux命令+280个Shell脚本,一定能帮到你!在 Arch Linux 上安装和使用 Yay | Linux 中国Linus Torvalds:Linux 内核中的 Rust、AI 和疲劳的维护者 | Linux 中国第四章第二节 四政五权的民权主义Linux 如何挽救老旧电脑(和地球) | Linux 中国Bazzite:专为 Steam Deck 和 PC 上的 Linux 游戏打造的发行版 | Linux 中国Wave:即使你讨厌命令行,也会喜欢的现代新 Linux 终端 | Linux 中国第四章第三节 土地国有化的民生主义Linux 黑话解释:Linux 中的 Super 键是什么? | Linux 中国如何在 Linux 中扩展 Veritas 文件系统(VxFS) | Linux 中国Linux 爱好者线下沙龙:LLUG 2023 深圳 - 活动预告 | Linux 中国全新的 Linux 电子书阅读器 Foliate 3.0 发布 | Linux 中国一款比 Curl、Wget 更轻量更强大的命令行下载工具!"妈妈让我来自首",7岁男孩在派出所写下"bǎozhèng书"备受欢迎的数字音频工作站 Studio One 新增了对 Linux 的支持 | Linux 中国修复 Arch Linux 中的 “Bash: man command not found” 错误 | Linux 中国ping 命令你真的会了嘛?网络高手告诉你如何玩的更 6!!!Linux 中的 ls 命令使用教程 | Linux 中国
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。