condicionais inline para atribuição

2

Existe um "equivalente inline" a expressões como as seguintes:

if [[ $VERBOSE == 1 ]]; then
  V=$FOO
else
  V=
fi

Estou pensando em algo assim em perl , por exemplo:

$V = $VERBOSE ? $FOO : undef;

(BTW, meu interesse não é tanto no negócio de reduzir cinco linhas para uma, já que sempre é possível reescrever o snippet de shell como

if [[ $VERBOSE == 1 ]]; then V=$FOO; else V=; fi

mas em uma única expressão condicional que é equivalente a um if -construct de declarações múltiplas.

Caso haja uma diferença, estou interessado principalmente na resposta de zsh , mas também na de bash .

    
por kjo 09.02.2014 / 18:11

4 respostas

3

Zsh sendo zsh, há uma maneira críptica:

V=${${VERBOSE#0}:+$FOO}

Isso define V para o valor de FOO se VERBOSE for um número diferente de zero e para a string vazia se VERBOSE estiver vazio ou 0 .

V=${${${VERBOSE/#/a}:#a1}:+foo}

Isso define V para o valor de FOO se VERBOSE for a string exata 1 e para a string vazia do contrário.

Agora esqueça isso e use a sintaxe clara com if ou case .

Se FOO for numérico, você poderá usar o operador ?: em uma expressão aritmética. O caso else tem que ser numérico também.

((V = VERBOSE ? FOO : 0))
    
por 10.02.2014 / 02:22
3

Bem, o mais próximo que eu posso pensar seria

[[ $VERBOSE == 1 ]] && V="YES" || V="NO"

Por exemplo:

$ VERBOSE=0
$ [[ $VERBOSE == 1 ]] && V="YES" || V="NO"; echo $V
NO
$ VERBOSE=1
$ [[ $VERBOSE == 1 ]] && V="YES" || V="NO"; echo $V
YES

O acima funciona para o bash e o zsh (e a maioria dos outros shells).

    
por 09.02.2014 / 18:18
3

Você pode usar case / switches no Bash para isso também. Apenas lembre-se de que eles não podem avaliar a lógica:

case "$VERBOSE" in
  1) V="YES" ;;
  *) V="NO"  ;;
esac
    
por 09.02.2014 / 19:05
2

Competindo pelos mais enigmáticos:

$ echo ${${(z):-NO YES}[2-!VERBOSE]}
NO
$ VERBOSE=123
$ echo ${${(z):-NO YES}[2-!VERBOSE]}
YES

Ou:

$ echo ${${(z):-NO YES}:!!VERBOSE:1}
YES
    
por 15.02.2014 / 21:54