bash conditional noop

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



conditional noop (3)

Aunque no estoy respondiendo la pregunta original sobre el comando no operativo, muchos (si no todos) los problemas cuando uno puede pensar que " en esta rama no tengo que hacer nada " pueden evitarse 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 sea mayor que "10", imprima "1" si $ a es menor que "5", de lo contrario, imprima "2"

tenemos que evitar una 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 que no hace nada cuando X , luego reformúlelo para evitar una rama donde X. Por lo general, puede evitar que se evite simplemente negando X y aplicándolo a todas las demás condiciones.

Entonces, 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, que incluye 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, la reestructuración de @Flimzys es ciertamente mejor, pero quería dar una regla general para todas las personas que buscan cómo hacer nada).

A veces cuando hago condicionales, necesito el código para no hacer nada, por ejemplo, aquí, Bash no quiere hacer nada cuando $a es mayor que "10", imprime "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 algún comando que no haga nada y que no ralentice mi script?


El comando no-operativa en shell es : (dos puntos).

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

Del manual bash :

: (dos puntos)
No haga nada más allá de expandir argumentos y realizar redirecciones. El estado de retorno es cero.


Probablemente solo puedas usar el true comando:

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