¿Qué comando significa "no hacer nada" en un condicional en Bash?

Resuelto Village asked hace 11 años • 4 respuestas

A veces, cuando hago condicionales, necesito que el código no haga nada, por ejemplo, aquí quiero que Bash no haga nada cuando $aes mayor que "10", imprima "1" si $aes menor que "5", de lo contrario, imprima "2":

if [ "$a" -ge 10 ]
then
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

Sin embargo, esto comete un error. ¿Existe algún comando que no haga nada y tampoco ralentice mi script?

Village avatar Jul 11 '13 08:07 Village
Aceptado

El comando no operativo en Shell es :(dos puntos).

if [ "$a" -ge 10 ]
then
    :
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

Del manual de bash :

:(dos puntos)
No haga nada más que expandir argumentos y realizar redirecciones. El estado de devolución es cero.

Barmar avatar Jul 11 '2013 01:07 Barmar

Probablemente puedas usar el truecomando:

if [ "$a" -ge 10 ]; then
    true
elif [ "$a" -le 5 ]; then
    echo "1"
else
    echo "2"
fi

Una alternativa, en su caso de ejemplo (pero no necesariamente en todos lados) es reordenar su if/else:

if [ "$a" -le 5 ]; then
    echo "1"
elif [ "$a" -lt 10 ]; then
    echo "2"
fi
Jonathan Hall avatar Jul 11 '2013 01:07 Jonathan Hall

Aunque no estoy respondiendo la pregunta original sobre el comando no-op, muchos (si no la mayoría) de los problemas cuando uno puede pensar " en esta rama no tengo que hacer nada " se pueden evitar simplemente reestructurando la lógica para que esta rama gane. No ocurre.

Intento dar una regla general usando el ejemplo de OP.

no hacer nada cuando $a es mayor que "10", imprime "1" si $a es menor que "5", de lo contrario, imprime "2"

Tenemos que evitar una rama donde $aobtenga más de 10, por lo que $a < 10como condición general se puede aplicar a todas las demás, siguiendo la condición.

En términos generales, cuando dice no hacer nada cuando X , reformúlelo para evitar una rama donde X . Por lo general, puede lograr que se evite simplemente negando X y aplicándolo a todas las demás condiciones.

Por lo tanto, el ejemplo de OP con la regla aplicada se puede reestructurar como:

if [ "$a" -lt 10 ] && [ "$a" -le 5 ]
then
    echo "1"
elif [ "$a" -lt 10 ]
then
    echo "2"
fi

Solo una variación de lo anterior, encerrando todo en la $a < 10condición:

if [ "$a" -lt 10 ]
then
    if [ "$a" -le 5 ]
    then
        echo "1"
    else
        echo "2"
    fi
fi

(Para este ejemplo específico, la reestructuración de @Flimzys es ciertamente mejor, pero quería dar una regla general para todas las personas que buscan cómo no hacer nada).

KeyNone avatar Jan 12 '2014 04:01 KeyNone

en lugar de :, verdadero, falso uso

echo -n ""

Evita líneas vacías en la terminal.

También puedes hacerlo de forma más concisa como:

echo -n
user1855805 avatar Feb 15 '2023 20:02 user1855805