Operador ternário em Bash

ternario_bash-1_abertura

Uma dica rápida de como criar um operador ternário em Bash!

Teoria

Em computação, um operador ternário é um operador que recebe três argumentos e que funciona como um atalho da instrução if, ou seja, a estrutura…

if ( «condição» ){
    valor = «verdadeiro»;
} else {
    valor = «false»;
}

Em linguagens de programação que implementam¹ operador ternário, como C, Java, JavaScript, Perl e Ruby pode ser reduzido para a seguinte sintaxe²:

valor = «condição» ? «verdadeiro» : «falso»

Que em Bash pode ser “simulada” assim:

valor=$( [[ «condição» ]] && echo «verdadeiro» || echo «falso» )

E equivalente ao bom e velho…

if [[ «condição» ]]; then
    valor=«verdadeiro»
else
    valor=«falso»
fi

…da sintaxe padrão do Bash.

Exemplos

Um exemplo básico…

debian=$([[ -f /etc/debian_version ]] && printf "yes" || printf "no")

Que retornará “yes” ou “no” caso a distribuição seja Debian/Ubuntu ou não:

$ echo $debian
yes

O mesmo vale para valores numéricos:

for a in {0..9}; do
   (( a%2 == 0 )) && printf "par " || printf "ímpar "
done

Cujo resultado é:

par ímpar par ímpar par ímpar par ímpar par ímpar

E, para finalizar,  há a vantagem da execução de comandos de acordo com uma regra de de validação…

[[ $USER == "root" ]] && apt update || sudo apt update

Sim, o exemplo é idiota, já que só precisaria do “sudo apt update”, mas  deu para pegar a ideia… 😀

Até!

(¹) Em Python a implementação do operador ternário tem sintaxe um pouco diferente das demais: “valor = «verdadeiro» if «condição» else «false»“.

(²) Que é geralmente chamada de a “sintaxe do C”.

Anúncios

2 comentários sobre “Operador ternário em Bash

  1. Como funciona pro caso de Operadores ternarios dentro de operadores ternarios em bash?

    ( condicao ? verdadeiro : (condicao_se_falso ? verdaderio : falso ) )

    Vou precisar de outro sub processo pra resolver o segundo operador ternario em bash ? Ou tem como resolver diretamente com uma serie de combinações de && e || ?

    Curtir

    • Olá! Concatenar as condições faz o Bash se enrolar com as condições, mas é possível encaixotar tudo dentro de uma subshell mas o problema é que as coisas vão começando a ficar ilegíveis…
      let b=2 ; for a in {0..4}; do printf "%d = " $a ; (( a>b )) && echo "maior" || ( (( a==b )) && echo "igual" || echo "menor" ); done

      Curtir

Os comentários estão desativados.