Sobre um outro modo de escrita do
if/then/else/elif em bash. Será falado porque a preferência geral é pelos
ifs aninhados.
Este modo já me era familiar. Constatei que foi usado dentro dos scripts de inicialização do
GNU/Linux. E já se foram alguns anos, desde então...
A forma comum dos
if, segue a seguinte escrita:
if [ <condição1> ]; then
instrução1;
instrução2;
instrução3;
...
elif [ <condição2>
instrução4;
instrução5;
instrução6;
...
else
instrução7;
instrução8;
instrução9;
...
fi.
A forma exibida agora, usa o duplo colchete [[ do bash, bem como os sinais && e ||:
[[ <condição> ]] && {
instrução1;
instrução2;
instrução3;
...
}
O duplo colchete funciona da mesma forma que um if e retorna 0, conforme os comandos que são "bem concluídos", ou que foram feitos pra retornar 0 (geralmente se tudo esteve bem).
No caso, este colchete retorna 0 se <condição> for verdadeira. Senão retorna 1.
Como o par &&, dá prosseguimento ao próximo comando se o anterior retornou 0, então, ele só executa esse próximo comando se a condição dos colchetes for verdadeira.
Ele ainda admite sequências de instruções em blocos agrupados por chaves {}. De certa forma me lembrou C/Perl.
Se a condição não é satisfeita, ele teria que executar o que estivesse num else (leia-se após falha). Comandos ligados pelo par || são executados dessa forma.
Fica:
[[ <condição1> ]] && {
instrução1;
instrução2;
instrução3;
...
} || {
instrução7;
instrução8;
instrução9;
...
}
elif estaria por conta de uma novo duplo colchete em seguida do ||:
[[ <condição1> ]] && {
instrução1;
instrução2;
instrução3;
...
} || [[ <condição2> ]] && {
instrução4;
instrução5;
instrução6;
...
} || {
instrução7;
instrução8;
instrução9;
...
}
Conclusão
- Esse modo de escrita existe e funciona.
- Alguém realmente usou/usa isso na inicialização de alguma distribuição?
- É estranho se comparado com o tradicional if.
- Não sei de estilo de escrita adequado pra esse modo.
- A legibilidade parece ser subjetiva e associada ao estilo de escrita.
- Procurei mostrar a existência do modo, deixando qualquer possibilidade de elegância para segundo plano.
- O fato de lembrar Perl, é por causa dos comandos/operadores and e or, de função muito similar.