Shell 脚本:使用 test 和 if 语句有什么区别?

Ita*_*not 3 testing shell if-statement

有什么区别

[ -e /usr/local/nagios ] && echo yes
Run Code Online (Sandbox Code Playgroud)

if [ -e /usr/local/nagios ]; then echo yes
fi
Run Code Online (Sandbox Code Playgroud)

什么时候适合使用它们中的任何一个?

假设我想测试 Nagios 是从源代码编译还是通过 yum 安装(源代码的默认安装位置是/usr/local/nagios并通过YUM/etc/nagios) - 然后我会知道插件文件夹所在的位置,并且它将允许我从 Nagios 中提取插件服务器到 Nagios 客户端并将它们放在正确的目录中。那么哪种方法最能实现这一目标呢?

提前致谢

Det*_*rer 9

[通常是命令的另一个名称test,只是期望]作为最后一个参数。您实际上可以编写两个命令:

test -e /usr/local/nagios && echo yes
Run Code Online (Sandbox Code Playgroud)

if test -e /usr/local/nagios; then echo yes; fi
Run Code Online (Sandbox Code Playgroud)

test[只是执行检查并返回0or 的shell 命令1,这就是为什么您可以像这样使用它[ -e file ] && echo exists(or test -e file && echo exists)。

当编写几行长的脚本时,我通常会发现使用if更清晰、更明确。

至于您的其他问题,依赖硬编码路径通常是一个坏主意(您可以从源安装到另一个目录,并且yum将来可能会在其他地方安装 nagios 或取决于某些配置)。我建议您尝试查询yum是否安装了 nagios(使用yum info nagiosyum list installed | grep nagios例如)。然后,如果 nagios 不是随 yum 安装的,但二进制文件在您的 中PATH,您可以尝试which nagios这将为您提供二进制文件的完整路径nagios