bash 链不执行第二个命令,但执行第三个命令



我正在尝试用 test 和 &&/|| 替换我的 bash 脚本中的所有 if 语句,因为它对我来说更容易阅读,但我在这个脚本上遇到了问题,它正在测试 $1 是否是一个文件,如果不是,它会退出

test -f "$1" || echo "$1 is not a file" && exit 1

当 $1 是一个文件时,echo 命令不执行,但退出,为什么? 有关信息,我正在使用 bash 5.1.8

你误解了&&/||的意思——它不是三元表达式。

  • &&表示"如果您执行的最后一个命令成功",而
  • ||的意思是"如果您执行的最后一个命令失败">

"最后执行的命令"部分很重要。它没有说"第一||&&行之前的命令",就像在结构为test ? exit : echo的类似三元表达式中一样,它说在您的代码中执行的最后一个命令

test -f "$1" || echo "$1 is not a file" && exit 1

它读作伪代码:

IF test fails (i.e. $1 is not a file) THEN
IF echo ... succeeds THEN
exit 1
ENDIF
ELSE (i.e. test succeeded and $1 is a file)
exit 1
ENDIF

我想你可能想写的是:

test -f "$1" || { ret="$?"; echo "$1 is not a file" >&2; exit "$ret"; }

这意味着:

IF test fails (i.e. $1 is not a file) THEN
save it's exit status in ret
echo ...
exit with the failure exit status from test
ENDIF

最新更新