bash - sintaxis - shell script linux if condition
Diferencia en Bash entre declaraciones IF con paréntesis y corchetes (2)
Mientras aprendí un poco sobre bash , veo cuatro tipos de formas de trabajar con declaraciones if
:
- Paréntesis único - (...)
- Doble paréntesis - ((...))
- Solo soporte cuadrado - [...]
- Doble paréntesis cuadrados [[...]]
Cuál es la diferencia entre paréntesis y corchetes en bash.
El shell solo ejecuta el comando y evalúa su código de salida. Un código de salida cero significa éxito; todos los otros valores indican falla.
if command; then
: things to do if the exit code from command was 0
else
: things to do if it was not 0
fi
while command; do
: things to do if the exit code was 0
done
El comando [
(aka test
) se usa muy comúnmente en condicionales, porque el shell Bourne original carecía de operadores incorporados para verificar si una cadena estaba vacía o si existía un archivo. Los shells modernos tienen este comando incorporado, y muchos shells tienen una versión extendida y modernizada [[
, pero esto no es apropiadamente portable para POSIX sh
y por lo tanto debe evitarse para los scripts portátiles. Esta pregunta relacionada explica las diferencias entre los dos con más detalle.
La notación (( ... ))
introduce un contexto aritmético. Una vez más, esto era algo que no formaba parte del shell Bourne original (tenía una expr
herramienta externa dedicada para estas cosas) pero los shells modernos lo tienen incorporado. El código de resultado de una expresión aritmética es 0 si el resultado de la evaluación aritmética no fue 0 (o un error).
La notación ( command )
crea una subcadena y evalúa el command
en eso. Hay situaciones en las que esto es realmente necesario y útil, pero si solo está aprendiendo la sintaxis, es poco probable que lo necesite.
... De hecho, en la mayoría de los guiones que he visto utilizar en un condicional, era claramente innecesario.
Otro antipatrio a tener en cuenta es
command
if [ $? = 0 ]; then
: things
fi
¿Casi nunca deberías examinar $?
explícitamente, y en particular, compararlo con cero es algo if
y while
específicamente lo hacemos para usted detrás de las escenas. Esto simplemente debe ser refactorizado para
if command; then
: ...
Las pruebas que has enumerado:
- Paréntesis único - (...) está creando una subshell
- Doble paréntesis - ((...)) es para operación aritmética
- Single Square Bracket - [...] es la sintaxis para la
test
POSIX - Doble paréntesis cuadrados - [[...]] es la sintaxis de las expresiones condicionales de bash (similar a la
test
pero más poderosa)
no son exhaustivos, puede usar lógica booleana
if command; then ...
también, porque los comandos tienen estado de salida. En bash
, 0
es true
y> 0
es false
.
Puede ver el estado de salida de esta manera:
command
echo $?
Ver :
http://wiki.bash-hackers.org/syntax/basicgrammar
http://wiki.bash-hackers.org/syntax/arith_expr
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals