
(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 if
que se trata. if
faz algo se some-command
(que pode ser uma função, um shell embutido ou um executável 1 ) retorna 0
os argumentos e a entrada com a qual é executado.
Quando você executa if [ ]
or if [[ ]]
, [ ]
e [[ ]]
são programas ou shell internos que retornam 0
se 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 if
construçã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.