Shell脚本:使用test和if语句之间的区别是什么?

时间:2014-10-21 09:08:17

标签: shell testing if-statement

之间的区别是什么
[ -e /usr/local/nagios ] && echo yes

if [ -e /usr/local/nagios ]; then echo yes
fi

什么时候使用其中任何一种都是正确的?

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

提前致谢

2 个答案:

答案 0 :(得分:2)

<强>选项1:

[ -e /usr/local/nagios ] && echo yes

在这里,您使用的是逻辑AND运算符(&amp;&amp;)。仅当第一个操作数返回true时,才会计算第二个操作数。首先将评估&#34; [-e / usr / local / nagios]&#34; 。 也就是说,检查/ usr / local / nagios是否存在。如果它不存在,则下一部分&#34;回显是&#34;不会被评估。因此,只有在/ usr / local / nagios存在时才会有效地&#34; echo yes&#34; ,因此将打印出yes。否则它不会。

<强>选项2:

if [ -e /usr/local/nagios ]
then
  echo yes
fi

这只是做同样事情的另一种方式。在这里,我们检查/ usr / local / nagios是否存在。如果存在,则打印是。否则什么都不做。

尽管第一个选项看起来更聪明,考虑到可读性,我会选择选项2.个人选择我会说。

答案 1 :(得分:1)

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

test -e /usr/local/nagios && echo yes

if test -e /usr/local/nagios; then echo yes; fi

test[是执行检查并返回01的juste shell命令,这就是为什么你可以像这样使用它{{1} }(或[ -e file ] && echo exists)。

当编写一个几行的脚本时,我通常会发现test -e file && echo exists的使用更清晰,更明确。

从你的另一个问题来看,依赖硬编码路径通常是一个坏主意(你可以从源安装到另一个目录,if可能会在未来的某个地方或根据某些配置安装nagios。我建议您尝试查询yum以查看是否安装了nagios(例如yumyum info nagios)。然后,如果nagios没有安装yum,但二进制文件位于yum list installed | grep nagios,您可以尝试使用PATH,它将为您提供which nagios二进制文件的完整路径。< / p>