qual é a diferença entre if e [[in bash?

3

vejo que

if cmd
then
echo Hi
fi

funciona de maneira diferente de

if [[ $(cmd) ]]
then
echo Hi
fi

Então, o que acontece quando há um [[e quando não há?

    
por Naai Sekar 13.04.2013 / 04:19

2 respostas

6

No shell [ é um alias para o comando de teste. é o comando. O [[ é um recurso de alguns shells que é apenas ligeiramente diferente. No bash, é uma palavra-chave, em vez de um comando, mas funciona como um comando.

Você pode pensar desta forma: você está executando [[ e fornecendo a saída de "$ (cmd)" como argumentos para esse comando. if , em seguida, verifica o status de retorno de [[ . Quando nenhum operador é dado a [[ , -n está implícito.

   -n string
          True if the length of string is non-zero.

Para seus exemplos:

if cmd          # check the return status of cmd
if [[ $(cmd) ]] # check if cmd has any output
    
por 13.04.2013 / 04:48
2

Uma instrução if expr (sem colchetes) verifica o status de retorno de expr depois de ser avaliado como um comando bash. Após o sucesso, ele é tratado como um valor true .

Por outro lado, if [[ expr ]] com colchetes duplos é uma palavra-chave bash -specific que pode manipular seu próprio conjunto de opções, como -f /path/to/file para testar a existência de arquivos, ou até mesmo manipular testes de variáveis, como $a == $b . Dentro desses colchetes, você deve explicitamente dizer para avaliar alguma expressão como um conjunto de comandos bash com if [[ $(cmds) ]] . Caso contrário, ele tratará qualquer coisa lá como uma expressão especial e será analisado de maneira diferente.

Há também a construção if [ expr ] , que geralmente é um alias (ou, em alguns casos, uma implementação aproximada de) if test expr . Se o comando test tiver uma opção disponível para uso, você também poderá usá-lo entre colchetes individuais.

Para mais diversão, há a construção if ((expr)) , que é melhor quando se lida com números, já que tudo dentro é avaliado como uma expressão aritmética. Essa também é uma palavra-chave, como os colchetes duplos.

Basicamente, if expr e if [ expr ] são portáveis (ou seja, todos os shells podem lidar com eles e lidar com eles de forma muito idêntica) e if [[ expr ]] e if (( expr )) são específicos da implementação, ou seja, são palavras-chave cuja avaliação depende altamente no shell em que você está usando (e se você não estiver usando algo como bash , zsh ou ksh , eles podem nem existir).

    
por 13.04.2013 / 04:49

Tags