我发现在 if 语句中使用 && 会导致 bash 出现错误。我想知道是否有人能解释为什么会出现这种情况,以及是否有办法仅在 command1 和 2 正常退出时运行 command3。我注意到,在这个例子中 var 可以为空,也可以不为空。
这是一个简单的例子:
#!/bin/bash
var=empty or not
command1
if [ -n "$var" ]; then
command2 &&
fi
command3
>>> line 7: syntax error near unexpected token `fi'
command3
要仅在command2
成功时运行,您可以使用您还希望仅
command2
在$var
非空时运行。因此,command3
仅在command2
成功时运行,并且command2
仅在$var
非空时运行。换句话说,仅在非空且成功时command3
运行。这将起作用:$var
command2
失败的原因是
&&
期望右侧有内容,但您没有提供任何内容。下一个标记是fi
,不是命令,因此&&
在该上下文中不起作用。现在,如果您想在
command1
失败时停止,您可以这样做:这样,如果
command1
失败,则if
永远不会评估该语句。您可能还需要考虑设置errexit
选项,假设,如果任何命令1bash
失败,则脚本将退出:最后,如果您希望
command3
即使为空也运行,但在不为空$var
的情况下,只有成功时才运行,您需要这样做:$var
command3
command2
1请注意,此处的“任何命令”是指“任何不作为条件语句一部分使用的命令”。例如,
if false; then echo true; done
将“失败”,因为false
设计为以非 0 状态退出,但是,在带有设置的 shell 中运行的脚本errexit
不会因此退出。只需删除
&&
第 7 行即可。相对
但一般来说,我看不出您的示例中有什么理由保留
echo "test" &&
,因为我几乎无法想象它echo
不会起作用。如果您想在脚本中的任何错误命令上退出,我建议您检查set -e
bash 功能。操作员
&&
运行左侧的命令,只有成功后才运行右侧的命令。foo && bar
和 非常相似if foo; then bar; fi
。如果要按顺序运行多个命令,并且只有前面的命令都成功后才运行下一个命令,那么最直接的方法就是堆叠
if
语句或&&
运算符:或者
如果你还想在最后退出 shell,如果任何命令失败,你可以
||
在最后堆叠一个操作符:这是可行的,因为如果
cmd1
..中的一个cmd3
失败了,剩下的那个&&
会跳过运行后面的那个,最后一个||
会获取错误的退出状态并运行exit
。缺点是你不知道哪个命令失败了,而且整个结构有点混乱。将来,如果能明确说明这一点,可能会更具可读性:
因为这样,您也可以相当轻松地添加错误消息: