我使用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
中包含的$(..)
成功语法
有人想为我提供更多信息吗?
答案 0 :(得分:0)
if
只需运行一个命令,在选择执行分支之前检查其返回码是0
(真)还是其他(假)。
[
(和test
)只是一个可能运行的命令,这是一个非常流行且有用的命令。但是在这种情况下,它并不能满足您的需求。您需要功能更复杂的东西,文件的grep。实际上有两个文件的grep。
您要做的就是确保在if
之后运行的命令(单数... ish)返回0(以防万一导致您要检查的行为),否则返回非0。在您的情况下,grep ... || grep ...
在您要运行其他命令时返回0,否则返回非0。没有与此相匹配的test
功能,因此您或多或少都有正确的想法。