if-then在Bash中使用grep和逻辑OR(| |)问题阻塞

if-then在Bash中使用grep和逻辑OR(| |)问题阻塞,bash,shell,grep,Bash,Shell,Grep,我在Bash函数声明中使用grep和逻辑OR | |使用以下if-then块: 如果grep-q | | grep-q;然后 以上方法很有效,耶 但我去清理了一下,认为应该是一样的,但失败了: 如果[grep-q]|[grep-q];然后 或 如果[grep-q | | grep-q];然后 我得到这个错误: -bash: [: missing `]' grep: ]: No such file or directory 我认为不使用[$]]语法将是安全的,可以减少混乱,但我不清楚为什么这样做

我在Bash函数声明中使用grep和逻辑OR | |使用以下if-then块:

如果grep-q | | grep-q;然后

以上方法很有效,耶

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

如果[grep-q]|[grep-q];然后

如果[grep-q | | grep-q];然后

我得到这个错误:

-bash: [: missing `]'
grep: ]: No such file or directory
我认为不使用[$]]语法将是安全的,可以减少混乱,但我不清楚为什么这样做不起作用。我已经在谷歌上搜索了一段时间,但我仍然不清楚为什么会失败

作为一个有趣的旁注,这是可以的:

如果[$grep-q]| |[$grep-q];然后

我的想法是。。包装grep语句是过分的,因为[…]将寻找grep的回报

我设置了-x以获得一些线索,我看到:

+ '[' grep -q <somepattern> <file> ']'
-bash: [: too many arguments
+ '[' grep -q <somepattern> <file2> ']'
-bash: [: too many arguments
我对测试的理解使我相信这应该有效,显然不行。虽然这可能与以下观察有关,即test不会在[..]或[[..]]块内执行grep命令,因此成功地使用包含在$中的grep。。语法

有人想为我解释一下吗?

如果只是运行一个命令,请在选择要执行的分支之前检查其返回代码是否为0 true或任何其他false

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


您需要做的就是确保您在if之后运行的命令返回0,以防它导致您想要检查的行为,否则返回非0。在您的情况下,grep…| | grep…在您想要运行额外命令时返回0,否则返回非0。没有与此匹配的测试功能,因此您有更多的or less,这是一个正确的想法。

[根本不是bash语法,它是命令的别名,也叫test。如果grep-q,而不是[grep-q…”运行,那么就应该运行,就像foo | bar运行两个简单的命令一样,foo和bar之间有短路逻辑OR,[grep-q | grep-q]运行两个单独的命令,[grep-q和grep-q]。因为这是两个独立的命令,所以第一个命令之前的命令与第二个命令之后的命令不匹配。好的,谢谢!这很有帮助。我在下面说明了,我对测试的理解很差[block.这很有帮助。干杯!它根本不是一个block;它只是一个常规命令,在解析方面与其他任何命令(ls、echo或诸如此类)一样处理,但需要注意的是,当它在名称下调用[,它希望看到一个]作为它的最后一个参数。相比之下,当在名称test下调用时,它没有这样的期望。好的,谢谢,这有助于我的理解!!我认为我需要更好地理解test.:。我尝试用test语句替换[…]块。我的困惑似乎是我以前的信念,即测试或[block被解释为shell命令本身;类似于将grep封装在$..中作为测试的隐含功能,这是我的问题,它需要更明确。再次感谢,