赋值的内联条件

kjo*_*kjo 2 zsh shell-script

是否有类似于以下表达式的“内联等效项”?:

if [[ $VERBOSE == 1 ]]; then
  V=$FOO
else
  V=
fi
Run Code Online (Sandbox Code Playgroud)

我在想这样的事情perl,例如:

$V = $VERBOSE ? $FOO : undef;
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,我的兴趣并不是将五行减为一行,因为人们总是可以将 shell 代码段重写为

if [[ $VERBOSE == 1 ]]; then V=$FOO; else V=; fi
Run Code Online (Sandbox Code Playgroud)

而是在一个等价于多语句结构的条件表达式中if。)

如果有区别,我主要对 的答案感兴趣zsh,但也对 的答案感兴趣bash

ter*_*don 9

好吧,我能想到的最接近的是

[[ $VERBOSE == 1 ]] && V="YES" || V="NO"
Run Code Online (Sandbox Code Playgroud)

例如:

$ VERBOSE=0
$ [[ $VERBOSE == 1 ]] && V="YES" || V="NO"; echo $V
NO
$ VERBOSE=1
$ [[ $VERBOSE == 1 ]] && V="YES" || V="NO"; echo $V
YES
Run Code Online (Sandbox Code Playgroud)

以上适用于 bash 和 zsh(以及大多数其他 shell)。


Gil*_*il' 5

zsh 是 zsh,有一种神秘的方式:

V=${${VERBOSE#0}:+$FOO}
Run Code Online (Sandbox Code Playgroud)

这将设置VFOOif的值VERBOSE是一个非零数字,并设置为空字符串 ifVERBOSE为空或0

V=${${${VERBOSE/#/a}:#a1}:+foo}
Run Code Online (Sandbox Code Playgroud)

这设置VFOOif的值VERBOSE是确切的字符串1,否则设置为空字符串。

现在忘记这一点,并使用if或的清晰语法case

如果FOO是数字,则可以?:在算术表达式中使用运算符。else 情况也必须是数字。

((V = VERBOSE ? FOO : 0))
Run Code Online (Sandbox Code Playgroud)