¿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