条件语句直接在 bash 中产生结果,而不使用 if

条件语句直接在 bash 中产生结果,而不使用 if

输出包含更多行的文件的名称,以及还有多少行(名称和数字之间有一个空格)。如果存在平局,则输出应为“foobar 0”。例如: foo 还有 1 行:“foo 1”; bar 还有 3 行:“bar 3”,相同的 # 行:“foobar 0”。没有 IF 语句。

为什么这不起作用:[[ $r -gt 0 ]] && { echo foo $r; } || [[ $r -lt 0 ]] && { echo bar $r; } || { echo foobar $r; }$r 是两个文件之间的差异

答案1

请注意,您的案例是不相交的,因此您实际上并不需要||.

[[ $r -gt 0 ]] && echo foo $r;     # positive 
[[ $r -lt 0 ]] && echo bar $r;     # negative
[[ $r -eq 0 ]] && echo foobar $r;  # zero

为什么这不起作用

&&并且||从左到右评估,它们之间的优先级没有区别,这使得if .. then .. else它们很难进行样式逻辑。您需要使用大括号或括号手动添加分组。 (或者只是使用该if声明,它的存在是有原因的。)

例如,这总是打印nonnegative,无论是否negative打印:

[ $x -ge 0 ]] || echo negative && echo nonnegative

如果您希望差值为正值,则需要在中间分支中将其取反,例如:

[[ $r -lt 0 ]] && echo bar $(( -r ));

答案2

使用圆括号,其工作原理如下:([[ $r -gt 0 ]] && { echo foo $r; }) || ([[ $r -lt 0 ]] && { echo bar $r; }) || { echo foobar $r; }

相关内容