¿Cuál es la diferencia entre if y [[ en bash?

¿Cuál es la diferencia entre if y [[ en bash?

veo que

if cmd
then
echo Hi
fi

funciona de manera diferente a

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

Entonces, ¿qué pasa cuando hay un [[ y cuando no lo hay?

Respuesta1

En el shell [hay un alias para el comando de prueba. ÉlesEl comando. Es [[una característica de algunos proyectiles que es sólo ligeramente diferente. En bash es una palabra clave, en lugar de un comando, pero funciona como un comando.

Puede pensarlo de esta manera: está ejecutando [[y proporcionando la salida de "$(cmd)" como argumentos para ese comando. ifluego verifica el estado de devolución de [[. Cuando no se dan operadores [[, -nestá implícito.

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

Para tus ejemplos:

if cmd          # check the return status of cmd
if [[ $(cmd) ]] # check if cmd has any output

Respuesta2

Una if exprdeclaración (sin corchetes) verifica el estado de devolución exprdespués de evaluarla como un comando bash. Si tiene éxito, se trata como un truevalor.

Por otro lado, if [[ expr ]]entre corchetes dobles hay un bash-específicopalabra claveque puede manejar su propio conjunto de opciones, como -f /path/to/fileprobar la existencia de archivos, o incluso manejar pruebas de variables como $a == $b. Dentro de estos corchetes, debe indicarle explícitamente que evalúe alguna expresión como un conjunto de comandos bash con if [[ $(cmds) ]]. De lo contrario, tratará todo lo que esté allí como una expresión especial y se analizará de forma diferente.

También está la if [ expr ]construcción, que generalmente es un alias (o, en algunos casos, una implementación aproximada de) if test expr. Si el testcomando tiene una opción disponible para usar, también puede usarla entre corchetes simples.

Para mayor diversión, está la if ((expr))construcción, que es mejor cuando se trata de números, ya que todo lo que contiene se evalúa como una expresión aritmética. Esta también es una palabra clave, como los corchetes dobles.

Básicamente, if exprand if [ expr ]son portátiles (es decir, todos los shells pueden manejarlos, y los manejan de manera prácticamente idéntica) y if [[ expr ]]son if (( expr ))específicos de la implementación, es decir, son palabras clave cuya evaluación depende en gran medida del shell en el que las estás usando (y si estás no usar algo como bash, zsho ksh, es posible que ni siquiera existan).

información relacionada