Qual é a sintaxe mais portátil para instruções `if`?

Qual é a sintaxe mais portátil para instruções `if`?

(NOTA: Háuma pergunta muito semelhante, perguntado ontem por estranho que pareça, mas não cobre as principais sintaxes que me preocupam. Se eu atualizasse a outra pergunta para incluí-las, as respostas poderiam não ser mais válidas, então vou me concentrar aqui no que foi perdido na outra pergunta. Qualquer pessoa que queira ver o quadro completo deve olhar tanto para as perguntas quanto para as respostas aceitas.)

Normalmente escrevo minhas instruções if da seguinte maneira:

if [[ -z "$SOMETHING" ]]; then
  # blah blah blah
fi

que funciona bem para mim no Bash e Z Shell, mas recentemente me depareiuma sintaxe que elimina completamente os colchetes:

if command -v given-command > /dev/null 2>&1; then
  echo given-command is available
else
  echo given-command is not available
fi

A versão sem colchetes é portátil? Como isso se compara às opções apresentadasaqui?

Minha versão padrão é suportada principalmente apenas no Bash e Z Shell (como a [[ -w /home/durrantm ]] && echo "writable"versão mencionada nessa outra pergunta)?

Responder1

Sim, sua versão padrão não é o padrão POSIX, conforme a pergunta que você vinculou às notas. No entanto, o seguinte é:

if some-command args; then ...

Eu diria que esta é a única forma portátil de if, já que é disso ifque se trata. iffaz algo se some-command(que pode ser uma função, um shell embutido ou um executável 1 ) retorna 0os argumentos e a entrada com a qual é executado.

Quando você executa if [ ]or if [[ ]], [ ]e [[ ]]são programas ou shell internos que retornam 0se a condição for verdadeira. Se você converter [para test, verá que estará sempre executando o formulário sem colchetes:

if [ ... ]
# same as 
if /bin/test ...

1 Para ser mais preciso, vejamos como a ifconstruçãoé definido:

Osecomando deve executar umlista compostae usar seu status de saída para determinar se deve executar outrolista composta.

O formato para oseconstrução é a seguinte:

if compound-list 
then
    compound-list
[elif compound-list 
then
    compound-list] ...
[else
    compound-list]
fi

Observe que umlista compostanão é o mesmo que umcomando composto.

informação relacionada