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

2

(NOTA: há uma pergunta muito semelhante , feita ontem de maneira bastante estranha, mas não cobre as principais sintaxes com as quais estou preocupado. Se eu fosse atualizar a outra pergunta para incluí-las, ela poderia tornar as respostas não mais válido, então vou me concentrar aqui no que foi perdido na outra pergunta. Qualquer um que queira o quadro inteiro deve olhar para ambas as perguntas e suas respostas aceitas.)

Eu normalmente escrevo minhas declarações if da seguinte forma:

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

que funciona bem para mim no Bash e no Z Shell, mas recentemente encontrei uma uma sintaxe que reduz os colchetes totalmente :

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 parênteses é portátil? Como se compara às opções apresentadas aqui ?

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

    
por iconoclast 17.11.2014 / 18:23

1 resposta

1

Sim, sua versão padrão não é padrão POSIX, como a pergunta que você vinculou a anotações. No entanto, o seguinte é:

if some-command args; then ...

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

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

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

1 Para ser mais preciso, vamos ver como o if construct está definido :

The if command shall execute a compound-list and use its exit status to determine whether to execute another compound-list.

The format for the if construct is as follows:

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

Note que uma lista composta não é a o mesmo que um comando composto .

    
por 17.11.2014 / 18:33