¿Qué comando significa "no hacer nada" en un condicional en Bash?
A veces, cuando hago 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
Sin embargo, esto comete un error. ¿Existe algún comando que no haga nada y tampoco ralentice mi script?
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.
Probablemente 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 todos lados) es reordenar su if/else:
if [ "$a" -le 5 ]; then
echo "1"
elif [ "$a" -lt 10 ]; then
echo "2"
fi
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 $a
obtenga más de 10, por lo que $a < 10
como 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 < 10
condició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).
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