
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. if
luego verifica el estado de devolución de [[
. Cuando no se dan operadores [[
, -n
está 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 expr
declaración (sin corchetes) verifica el estado de devolución expr
después de evaluarla como un comando bash. Si tiene éxito, se trata como un true
valor.
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/file
probar 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 test
comando 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 expr
and 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
, zsh
o ksh
, es posible que ni siquiera existan).