我一直在尝试编写一个脚本来检查是否在特定文件/文件夹中找不到特定内容,然后它应该打印“失败”。否则它应该打印“成功”。但是,以下脚本导致多个错误。
if [[ ( ! grep '/example.com' /opt/nfs &>/dev/null ) || ( ! grep -R '/example.com' /data &>/dev/null) ]]
then
echo "Failed"
else
echo "Passed"
fi
谁能告诉我为什么它会导致错误,是否有办法消除错误并获得预期的输出?
更新:我收到以下错误:
s.sh: line 1: conditional binary operator expected
s.sh: line 1: expected `)'
s.sh: line 1: syntax error near `'/example.com''
s.sh: line 1: `if [[ ( ! grep '/example.com' /opt/nfs &>/dev/null ) || ( ! grep -R '/example.com' /data &>/dev/null) ]]'
答案1
[[...]]
是用于执行比较和其他类型测试的构造。它是一个ksh
命令,其解析遵循特殊的语法规则并替换[
标准命令(使用正常的简单命令解析)。
在这里,没有任何用处。您要测试的是命令是否成功(不是grep
or命令),所以它只是:grep
[[...]]
[
if grep -qF /example.com /opt/nfs || grep -RqF /example.com /data
then echo passed
else echo failed
fi
-q
抑制输出,并通过在找到一个匹配项后立即退出而不是尝试查找所有匹配项来进行优化。
答案2
直接的方法:
grep -q '/example.com' /opt/nfs || grep -Rq '/example.com' /data
if [ $? -eq 0 ]; then # check exit status
echo "Passed"
else
echo "Failed"
fi
grep的
-q
选项告诉不要将任何内容写入标准输出。0
如果发现任何匹配项,即使检测到错误,也会立即以零状态退出。$?
- 包含退出状态最后运行命令的代码
上式还可以简化为:
if grep -q '/example.com' /opt/nfs || grep -Rq '/example.com' /data; then
echo "Passed"
else
echo "Failed"
fi
答案3
以下是您的解决方案的可能简化:
- 首先,如果您使用 GNU
grep
,它可以在参数行中提供的多个文件|文件夹中搜索。所以基本上不需要启动两个grep
命令来在两个不同的文件夹中查找相同的模式:grep '/example.com' /opt/nfs /data
搜索出现的工作/example.com在这两个文件夹中。 - 后两个否定等于一个肯定。那么为什么不简单地使用此代码:
if grep -rq "/example.com" /opt/nfs /data ; then echo "success" ; else echo "failed" ; fi
grep
如果它发现“/example.com”出现在/opt/nfs
或中,就会成功/data
它会更快、更高效,只有一个grep
从壳中生成。
答案4
尝试这样:
if [[ ! $(grep '/example.com' /opt/nfs &>/dev/null) || ! $(grep -R '/example.com' /data &>/dev/null) ]]
then
echo "Failed"
else
echo "Passed"
fi
但我认为你的脚本没有意义,因为你抑制了stdout
和。命令的输出始终为空。替换为仅抑制。stderr
&>/dev/null
grep
&
2
stderr