declaraciones If!
Decisiones, decisiones.
Introducción
Bash si las declaraciones son muy útiles. En esta sección de nuestro tutorial de scripts de Bash aprenderá las formas en que puede usar las sentencias if en sus scripts de Bash para ayudar a automatizar tareas.
Las sentencias If (y, estrechamente relacionadas, las sentencias case) nos permiten tomar decisiones en nuestros scripts Bash. Nos permiten decidir si Ejecutar o no un fragmento de código en función de las condiciones que podamos establecer., Las sentencias If, combinadas con bucles (que veremos en la siguiente sección) nos permiten hacer scripts mucho más complejos que pueden resolver tareas más grandes.
al igual que lo que hemos visto en secciones anteriores, su sintaxis es muy específica, así que Manténgase al tanto de todos los pequeños detalles.
instrucciones If básicas
una instrucción if básica dice efectivamente, si una prueba en particular es verdadera, entonces realice un conjunto dado de acciones. Si no es cierto, entonces no realice esas acciones., If sigue el siguiente formato:
if
then
<commands>
fi
cualquier cosa entre entonces y fi (si hacia atrás) se ejecutará solo si la prueba (entre corchetes) es verdadera.
veamos un ejemplo sencillo:
if_example.sh
- #!/ bin / bash
- # Basic if statement
- if
- then
- echo Hey That\’s a large number.,
- pwd
- fi
- date
vamos a desglosarlo:
- Línea 4 – vamos a ver si el primer argumento de la línea de comandos es mayor que 100
- línea 6 y 7 – solo se ejecutará si la prueba en la Línea 4 devuelve true. Puedes tener tantos comandos aquí como quieras.
- línea 6 – la barra invertida ( \ ) delante de la comilla simple ( ‘ ) es necesaria ya que la comilla simple tiene un significado especial para bash y no queremos ese significado especial. La barra invertida escapa al significado especial para volver a ser una comilla simple normal.,
- La Línea 8-fi señala el final de la instrucción if. Todos los comandos después de esto se ejecutarán normalmente.
- línea 10-debido a que este comando está fuera de la instrucción if, se ejecutará independientemente del resultado de la instrucción if.
- . /if_example.sh 15
- Vie 5 Feb 9: 06: 30 2021
- . /if_example.sh 150
- Hey ese es un gran número.
- / home / ryan / bin
- Vie 5 Feb 9: 06: 30 2021
siempre es una buena práctica probar sus scripts con entrada que cubre los diferentes escenarios que son posibles.,
Test
Los corchetes ( ) en la sentencia if anterior son en realidad una referencia al comando test. Esto significa que todos los operadores que la prueba permite se pueden utilizar aquí también. Busque en la página de manual de test para ver todos los operadores posibles (hay bastantes), pero algunos de los más comunes se enumeran a continuación.
Operador | Descripción |
---|---|
! Expresión | la expresión es false. |
-n STRING | la longitud de La CUERDA es mayor que cero., |
– Z STRING | la longitud de la cadena es cero (es decir, está vacía). |
CADENA1 = CADENA2 | CADENA1 es igual a TEXTO2 |
CADENA1 != TEXTO2 | CADENA1 no es igual a TEXTO2 |
INTEGER1 -eq INTEGER2 | INTEGER1 es numéricamente igual a la INTEGER2 |
INTEGER1 -gt INTEGER2 | INTEGER1 es numéricamente mayor que INTEGER2 |
INTEGER1 -lt INTEGER2 | INTEGER1 es numéricamente menor que INTEGER2 |
-d ARCHIVO | ARCHIVO existe y es un directorio., |
-Archivo e | el archivo existe. |
-r ARCHIVO | ARCHIVO existe y se concede permiso de lectura. |
-archivo s | el archivo existe y su tamaño es mayor que cero (es decir. no está vacía). |
– archivo W | el archivo existe y se concede el permiso de escritura. |
– archivo X | el archivo existe y se concede el permiso de ejecución. |
algunos puntos a tener en cuenta:
- = Es ligeramente diferente a-eq. devolverá false como = hace una comparación de cadenas (ie., carácter por carácter el mismo) mientras que-eq hace una comparación numérica el significado devolverá verdadero.
- Cuando nos referimos al archivo anterior, en realidad nos referimos a una ruta. Recuerde que una ruta puede ser absoluta o relativa y puede referirse a un archivo o un directorio.
- debido a que es solo una referencia a la prueba de comandos, podemos experimentar y solucionar problemas con la prueba en la línea de comandos para asegurarnos de que nuestra comprensión de su comportamiento es correcta.
- test 001 = 1
- echo??
- 1
- prueba 001 -eq 1
- echo $?,
- 0
- touch myfile
- test-s myfile
- echo??
- 1
- ls / etc > myfile
- test-s myfile
- echo??
- 0
vamos a desglosarlo:
- línea 1-Realice una comparación basada en cadenas. La prueba no imprime el resultado así que en su lugar comprobamos su estado de salida que es lo que haremos en la siguiente línea.
- línea 2 – la variable $? contiene el estado de salida del comando ejecutado previamente (en este caso test). 0 significa verdadero (o éxito). 1 = falso (o fallo).,
- Línea 4 – Esta vez estamos realizando una comparación numérica.
- línea 7-crear un nuevo archivo en blanco myfile (asumiendo que myfile no existe ya).
- línea 8 – ¿El tamaño de mi archivo es mayor que cero?
- línea 11-redirige algo de contenido a myfile para que su tamaño sea mayor que cero.
- línea 12-Pruebe de nuevo el tamaño de myfile. Esta vez es verdad.
Indenting
notará que en la sentencia if anterior indentamos los comandos que se ejecutaron si la sentencia era verdadera., Esto se conoce como sangría y es una parte importante de escribir código bueno y limpio (en cualquier lenguaje, no solo scripts Bash). El objetivo es mejorar la legibilidad y dificultar que cometamos errores simples y tontos. No hay reglas con respecto a la sangría en Bash, por lo que puede sangrar o no sangría como quiera y sus scripts seguirán funcionando exactamente igual. Sin embargo, le recomiendo encarecidamente que indente su código (especialmente a medida que sus scripts se hacen más grandes), de lo contrario, encontrará cada vez más difícil ver la estructura en sus scripts.,
sentencias if anidadas
hablando de sangría. Este es un ejemplo perfecto de cuando te hace la vida más fácil. Puede tener tantas sentencias if como sea necesario dentro de su script. También es posible tener una sentencia if dentro de otra sentencia if. Por ejemplo, podemos analizar un número dado en la línea de comandos de la siguiente manera:
vamos a desglosarlo:
- Línea 4 – realice lo siguiente, solo si el primer argumento de la línea de comandos es mayor que 100.
- línea 8 – Esta es una ligera variación de la sentencia if., Si nos gustaría comprobar una expresión entonces podemos utilizar los corchetes dobles al igual que hicimos para las variables.
- La Línea 10 – solo se ejecuta si ambas sentencias if son verdaderas.
yo dawg, te manada como si las declaraciones así que pongo una declaración if dentro de su declaración if.
Xzibit
(Xzibit en realidad no dijo eso, pero estoy seguro de que lo habría hecho, si hubiera alojado Pimp My Bash Script.,)
puede anidar tantas sentencias if como desee, pero como regla general, si necesita anidar más de 3 niveles de profundidad, probablemente debería pensar en Reorganizar su lógica.
If Else
a veces queremos realizar un cierto conjunto de acciones si una instrucción es verdadera, y otro conjunto de acciones si es falsa. Podemos acomodar esto con el mecanismo else.,
if
then
<commands>
else
<other commands>
fi
ahora podríamos leer fácilmente desde un archivo si se suministra como un argumento de línea de comandos, de lo contrario leer desde STDIN.
else.sh
- #!/bin/bash
- # else ejemplo
- si
- luego
- nl $1
- else
- nl /dev/stdin
- fi
Si Elif Else
A veces podemos tener una serie de condiciones que pueden conducir a caminos diferentes.,
si
<comandos>
elif
<diferentes comandos>
otra cosa
<otros comandos>
fi
Por ejemplo puede ser el caso de que si tienes 18 años o más, usted puede ir a la fiesta. Si no lo estás, pero tienes una carta de tus padres, puedes irte, pero debes regresar antes de la medianoche. De lo contrario no puedes ir.
Puedes tener tantas ramas elif como quieras. El último else también es opcional.,
operaciones booleanas
a veces solo queremos hacer algo si se cumplen varias condiciones. Otras veces nos gustaría realizar la acción si se cumple una de varias condiciones. Podemos acomodarlos con operadores booleanos.
- and – &&
- or – ||
For instance maybe we want to perform an operation if the file is legible and has a size greater than zero.
and.sh
- #!,/bin/bash
- # y ejemplo
- si &&
- luego
- echo Este archivo es útil.
- fi
tal vez nos gustaría realizar algo ligeramente diferente si el Usuario es bob o andy.
or.sh
- #!/ bin / bash
- # O Ejemplo
- if / /
- then
- ls-ALH
- else
- ls
- fi
Case Statements
a veces podemos desear tomar diferentes caminos basados en una variable que coincida con una serie de patrones., Podríamos usar una serie de declaraciones if y elif, pero eso pronto crecería para ser poco halagüeño. Afortunadamente hay una declaración de caso que puede hacer las cosas más limpias., It’s a little hard to explain so here are some examples to illustrate:
case <variable> in
<pattern 1>)
<commands>
;;
<pattern 2>)
<other commands>
;;
esac
Here is a basic example:
case.sh
- #!,/bin/bash
- # ejemplo de caso
- caso 1 $en
- inicio)
- echo de inicio
- ;;
- stop)
- echo detenerme
- ;;
- reiniciar)
- echo reiniciar
- ;;
- *)
- echo don\’t saber
- ;;
- esac
Vamos a desglosarlo:
- Línea 4 – Esta línea comienza la casemechanism.
- línea 5-Si $1 es igual a ‘start’ entonces realice las acciones siguientes. El) significa el final del patrón.,
- línea 7-identificamos el final de este conjunto de sentencias con un doble punto y coma ( ;; ). A continuación se presenta el siguiente caso a considerar.
- Línea 14 – Recuerde que la prueba para cada caso es un patrón. El * representa cualquier número de caracteres. Es esencial un catch all si por si ninguno de los otros casos coinciden. No es necesario, pero se utiliza a menudo.
- La Línea 17-esac está al revés e indica que estamos al final de la sentencia case. Cualquier otra instrucción posterior se ejecutará normalmente.
- . /case.sh start
- starting
- .,/case.sh reiniciar
- reiniciar
- ./case.sh bla
- no sé
Ahora veamos un ejemplo ligeramente más complejo, donde los patrones se utilizan un poco más.
Summary
Actividades
Ahora vamos a tomar algunas decisiones.
- cree un script Bash que tomará 2 números como argumentos de la línea de comandos. Imprimirá en la pantalla el mayor de los dos números.,
- cree un script Bash que acepte un archivo como argumento de línea de comandos y lo analice de ciertas maneras. eg. puede comprobar si el archivo es ejecutable o escribible. Debe imprimir un cierto mensaje si es verdadero y otro si es falso.
- Crear un script Bash que imprimirá un mensaje basado en el día de la semana que es (por ejemplo. ‘Happy hump day ‘para Wedensday,’ TGIF ‘ para el viernes, etc.).