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


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

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

Esto hace un error sin embargo. ¿Hay un comando que no hará nada y tampoco ralentizará mi script?

Author: codeforester, 2013-07-11

3 answers

El comando no-op en el 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 retorno es cero.

 233
Author: Barmar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-26 19:31:34

Probablemente solo puede usar el comando true:

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 todas partes) es reordenar su if/else:

if [ "$a" -le 5 ]; then
    echo "1"
elif [ "$a" -lt 10 ]; then
    echo "2"
fi
 28
Author: Flimzy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-11 01:26:19

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

Intento dar una regla general usando el ejemplo de OPs

No hacer nada cuando a a es mayor que" 10", imprimir" 1 "si a a es menor que" 5", de lo contrario, imprimir"2"

Tenemos que evitar un rama donde $a obtiene más de 10, por lo que $a < 10 como condición general se puede aplicar a cualquier otra condición, siguiente.

En términos generales, cuando dice no hacer nada cuando X, entonces la pregunta como evitar una rama donde X. Por lo general, puede hacer que la evitación suceda simplemente negando X y aplicándolo a todas las demás condiciones.

Así que el ejemplo de OPs con la regla aplicada puede ser reestructurado 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 condición $a < 10:

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

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

 8
Author: Basti M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:26