Bash中使用grep和逻辑OR(||)问题的if-then块

时间:2019-03-05 21:30:44

标签: bash shell grep

我使用grep和逻辑或(||)在Bash函数声明中具有以下if-then块:

if grep -q <somepattern> <file> || grep -q <somepattern> <file2>; then

以上方法效果很好,是的!

但是我去“清理了一下”,以为应该是一样的,但是失败了:

if [ grep -q <somepattern> <file> ] || [ grep -q <somepattern> <file2> ]; then

if [ grep -q <somepattern> <file> || grep -q <somepattern> <file2> ]; then

我收到此错误:

-bash: [: missing `]'
grep: ]: No such file or directory

我认为不使用[[ $(<foo>) ]]语法是安全的,可以减少混乱,但是我不清楚为什么这不起作用。谷歌搜索了一下,我仍然不清楚为什么它失败了。

作为一个有趣的旁注,没关系:

if [ $(grep -q <somepattern> <file>) ] || [ $(grep -q <somepattern> <file2>) ]; then

我的想法是$(..)包裹了grep语句,因为[..]会从grep寻找回报。

set -x得到了一些线索,我看到了:

+ '[' grep -q <somepattern> <file> ']'
-bash: [: too many arguments
+ '[' grep -q <somepattern> <file2> ']'
-bash: [: too many arguments

我对test的理解使我相信这应该行得通,显然不行。尽管这可能与以下观察结果有关:test不会在[..][[..]]块内执行grep命令,因此grep中包含的$(..)成功语法

有人想为我提供更多信息吗?

1 个答案:

答案 0 :(得分:0)

if只需运行一个命令,在选择执行分支之前检查其返回码是0(真)还是其他(假)。

[(和test)只是一个可能运行的命令,这是一个非常流行且有用的命令。但是在这种情况下,它并不能满足您的需求。您需要功能更复杂的东西,文件的grep。实际上有两个文件的grep。

您要做的就是确保在if之后运行的命令(单数... ish)返回0(以防万一导致您要检查的行为),否则返回非0。在您的情况下,grep ... || grep ...在您要运行其他命令时返回0,否则返回非0。没有与此相匹配的test功能,因此您或多或少都有正确的想法。