关于bash:如果ack找到结果,请执行此操作;

If ack finds results do this; else do that

本问题已经有最佳答案,请猛点这里访问。

我正在写一个脚本,它将自动执行我的一个更乏味的任务。我已经把所有的东西都记下来了,我可以让代码的各个组件做我想做的事情,但是我在尝试让if语句工作时遇到了麻烦。我想做的是:

1
2
3
4
5
if [ ack --ignore-case 'foo' ]; then
    Do this action
else
    Do that action
fi

从现在开始,它总是执行else操作,即使ack参数为true。

谢谢!


放下方括号

1
2
3
4
5
if ack --ignore-case 'foo' ; then
    Do this action
else
    Do that action
fi

您不想检查字符串ack --ignore-case 'foo'是否为非空,您想检查ack的退出状态。

你应该收到一个警告,告诉你:

1
-bash: [: --ignore-spaces: binary operator expected


卸下[-要检查ACK的退出状态:

1
if ack --ignore-case 'foo'; then

如果遇到匹配,ACK返回0(成功)退出状态。

虽然它看起来像一个语法结构,但[实际上是一个函数(与test同义),如果测试通过,它将返回0。if正在查看此函数的返回代码。在这种情况下,ACK提供了您需要的返回代码,因此您不应该同时使用[