【发布时间】:2019-06-20 12:50:28
【问题描述】:
我刚刚在编写 if/then/else 块的替代形式时得到了意想不到的结果。
> #this is the behaviour I expect:
> if [[ 1 -eq 1 ]]; then echo "good"; false; else echo "bad"; fi
good
> #assuming no error in the first block these brackets behave okay as well:
> [[ 1 -eq 1 ]] && { echo "good"; } || { echo "bad"; }
good
> #this however allows the process to jump into the first AND second block
> [[ 1 -eq 1 ]] && { echo "good"; false; } || { echo "bad"; }
good
bad
为什么花括号方法将进程传递到第二个块。我知道有些语句在块结束之前必须有一个;,但是如果 bash 块在错误条件下作为最后一条语句表现不佳,这些块似乎“不安全”使用。
【问题讨论】:
-
foo && bar || baz是完全安全的,只要您不尝试将它们用作它们不是的东西。他们不是if; then; else。 -
这就是为什么shellcheck.net 标记
foo && bar || baz并带有警告SC2015,以劝阻那些在不知道它实际作用的情况下使用它的人。 -
(这和代码块有什么关系?对于any命令也是一样的;不管是单个命令回显某些东西然后返回false,还是单独的
echo和false一个块中的命令)。
标签: bash conditional-statements codeblocks