
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. if
em seguida, verifica o status de retorno de [[
. Quando nenhum operador é fornecido [[
, -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
Responder2
Uma if expr
instrução (sem colchetes) verifica o status de retorno expr
após ser avaliada como um comando bash. Após o sucesso, é tratado como um true
valor.
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/file
testar 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 test
comando 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 expr
e 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).