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

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

eu vejo isso

if cmd
then
echo Hi
fi

funciona de forma diferente de

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

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

Responder1

No shell [há um alias para o comando de teste. Istoéo comando. Essa [[é uma característica de alguns shells que é apenas ligeiramente diferente. No bash é uma palavra-chave, e não 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. ifem seguida, verifica o status de retorno de [[. Quando nenhum operador é fornecido [[, -nestá 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

Responder2

Uma if exprinstrução (sem colchetes) verifica o status de retorno exprapós ser avaliada como um comando bash. Após o sucesso, é tratado como um truevalor.

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

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

Para mais diversão, existe o if ((expr))construto, que é melhor quando se trata de números, já que tudo que está dentro é avaliado como uma expressão aritmética. Esta também é uma palavra-chave, como os colchetes duplos.

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

informação relacionada