¿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?
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
:
(dos puntos)
No haga nada más que expandir argumentos y realizar redirecciones. El estado de retorno es cero.
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
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.)
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