[[test]] || <action>格式在bash脚本中不起作用

the*_*ien 0 bash

继续我昨天问的一个问题,我有一个脚本,它运行三个测试并报告每个测试.

Tom Fenech为我提供了一些简单的代码,应该解决我的问题.但是,它似乎没有按预期工作.

pass=1
[[ test1 ]] || { echo 'test1 failed'; pass=0 }
[[ test2 ]] || { echo 'test2 failed'; pass=0 }
[[ test3 ]] || { echo 'test3 failed'; pass=0 }
[[ $pass -eq 0 ]] && echo 'one of the tests failed'
Run Code Online (Sandbox Code Playgroud)

让我们只使用其中一个测试.假设我有一个变量,我需要将其值与数字进行比较:

[[ ${VAR} == '128' ]] || { echo "test failed"; pass=0 }
Run Code Online (Sandbox Code Playgroud)

这总是会导致错误:

./magic_sysrq.sh: line 64: syntax error near unexpected token `else'
./magic_sysrq.sh: line 64: `else'
Run Code Online (Sandbox Code Playgroud)

对于上下文,脚本包含if...elif...else...fi运行这些测试的块.第一个(if)块以一种方式运行代码,具体取决于RedHat的版本,第二个(elif)以另一种方式运行它也取决于RedHat版本.该else块只是说由于意外版本没有做任何事情.

我总是使用提供的代码格式来解决上述错误.如果我删除括号,我可以通过错误.但是,无论成功更改,这都会导致测试失败.

我已经尝试将格式设置为

[[ ${VAR} == '128' ]] || echo "test failed" || pass=0
Run Code Online (Sandbox Code Playgroud)

这也不对.即使出现故障,它也会产生成功消息.我已尝试将第二个逻辑运算符设置为,&&但即使成功更改,也会导致测试失败消息.

有人可以说明我可能做错了吗?我想我可以写出if...fi每个测试的所有块作为另一个建议,但这最多是乏味的.

Cha*_*ffy 6

句法.

[[ ${VAR} == '128' ]] || { echo "test failed"; pass=0 }
Run Code Online (Sandbox Code Playgroud)

......缺少分号; 它需要是:

[[ ${VAR} == '128' ]] || { echo "test failed"; pass=0; }
Run Code Online (Sandbox Code Playgroud)

...否则,它}被解释为一个参数(或者,紧跟在此处的变量赋值之后,作为应用于环境的该赋值运行的命令),保持{未闭合,导致看到语法错误.


相比之下:

[[ ${VAR} == '128' ]] || echo "test failed" || pass=0
Run Code Online (Sandbox Code Playgroud)

....出于不同的原因是错误的:如果echo命令成功(并且echo命令失败并且出现错误是非常罕见的),它将永远不会继续运行pass=0.(对于任何实现短路布尔逻辑的语言都是如此,而不仅仅是bash).