$ si es verdadero; entonces repita SÍ; en caso contrario, repita NO;
$ si es verdadero && verdadero; entonces repita SÍ; de lo contrario, repita NO; entonces repita SÍ; de lo contrario, repita NO; ; luego repita SÍ; de lo contrario repita NO;
$ si es verdadero || verdadero; entonces repita SÍ; de lo contrario, repita NO; entonces repita SÍ; en caso contrario, repita NO; falso || falso; luego haga eco SÍ; de lo contrario, haga eco NO;
$ si ! falso; entonces repita SÍ; de lo contrario repita NO;
se puede ver
verdaderoy
FALSOProcedemos de acuerdo con nuestra comprensión de las operaciones lógicas, pero para comprender mejor la implementación de operaciones lógicas de Shell, tenemos que descubrir,
verdaderoy
FALSO¿Cómo funciona?
La respuesta es: No.
verdaderoy
FALSONo son valores lógicos en sí mismos, todos son comandos integrados del Shell, pero su valor de retorno es un "valor lógico":
$ verdadero$ eco $?0$ falso$ eco $?1
se puede ver
verdaderodevolvió 0, y
FALSOLuego se devuelve 1. No se corresponde con los verdaderos valores 1 y 0 que aprendimos en matemáticas discretas, sino que es todo lo contrario.
$ ayuda true falsetrue: true Devuelve un resultado exitoso.false: false Devuelve un resultado fallido.$ tipo true falsetrue es un shell incorporadofalse es un shell incorporado
ilustrar:
$?Es una variable especial que almacena el estado final (código de estado de salida) del último proceso.
A partir de las operaciones anteriores, no es difícil pensar por qué se pone énfasis en la programación en lenguaje C.
principalAgregar delante de la función
enteroy agregar al final
regresar 0. Porque en el Shell, 0 se utilizará como una señal de si el programa finaliza correctamente. Esto es lo que hace el Shell.
verdaderoy
FALSOEn esencia, se utilizan para reflejar si un determinado programa finaliza correctamente, en lugar de los tradicionales valores verdadero y falso (1 y 0, por el contrario, devuelven 0 y 1). Afortunadamente, no necesitamos preocuparnos por estos cuando realizamos operaciones lógicas.
En la sección anterior, hemos entendido claramente qué es el "valor lógico" en Shell: es el valor de retorno cuando el proceso sale. Si regresa con éxito, es verdadero, si regresa sin éxito, es falso.
Y la prueba condicional solo usa
pruebaDicha instrucción se utiliza para realizar pruebas numéricas (varias pruebas de atributos numéricos), pruebas de cadenas (varias pruebas de atributos de cadenas) y pruebas de archivos (varias pruebas de atributos de archivos). Juzgamos si la prueba correspondiente es exitosa y, por lo tanto, completamos varias tareas de rutina. Además, junto con la combinación lógica de varias pruebas, se pueden completar tareas más complejas.
$ si prueba 5 -eq 5; entonces haga eco SÍ; de lo contrario, haga eco NO;
$ si la prueba -n no está vacía; entonces haga eco SÍ; de lo contrario, haga eco NO; entonces haga eco SÍ; entonces haga eco SÍ; de lo contrario, haga eco NO; si prueba -n; entonces haga eco SÍ; de lo contrario, haga eco NO;
$ si prueba -f /boot/System.map; entonces haga eco SÍ; de lo contrario, haga eco NO;
$ a=5;b=4;c=6;$ si prueba $a -eq 5 -a $b -eq 4 -a $c -eq 6 entonces haga eco SÍ;
$ si prueba -f /etc/profile -o -d /etc/profile; entonces haga eco SÍ; de lo contrario, haga eco NO;
!NO operación
$ si prueba! -f /etc/profile; entonces haga eco SÍ; en caso contrario, haga eco NO;
Lo anterior sólo demuestra
pruebaComanda algunas pruebas muy simples que puedes pasar
prueba de ayudaConseguir
pruebaMás usos de . Cabe señalar que
pruebaExisten algunas diferencias entre las operaciones lógicas dentro del comando y los operadores lógicos del Shell. Las correspondientes son:
-ay
&&,
-oy
||, los dos no pueden confundirse. En lugar de que las operaciones sean
!, compárelos a continuación.
$ cat > test.sh#!/bin/bashecho test[CTRL+D] # Presione la combinación de teclas CTRL y D para finalizar la entrada cat, igual que a continuación, ya no especifique $ chmod +x test.sh$ if test -s prueba .sh -a -x prueba.sh; luego repite SÍ; si no, repite NO;
$ str1=test$ str2=test$ si prueba -z $str2 -o $str2 == $str1; entonces echo SÍ; de lo contrario echo NO$ si prueba -z $str2 || luego repita SÍ; de lo contrario, repita NO;
$ i=5$ si prueba! $i -lt 5 -a $i -ne 6; entonces repite SÍ; de lo contrario, repite NO$ si! ; de lo contrario eco NO;
Es fácil detectar la diferencia entre ellos,
-ay
-oComo parámetro del comando de prueba, se usa dentro del comando de prueba y
&&y
||Se utiliza para calcular el valor de retorno de la prueba,
!Común a ambos. Lo que necesita atención es:
A veces no es necesario
!operador, como
-eqy
-nordesteTodo lo contrario, se puede utilizar para probar si dos valores son iguales;
-zy
-norteTambién es correspondiente y se utiliza para probar si una determinada cadena está vacía.
existir
Intentoadentro,
pruebaLos comandos se pueden reemplazar con el operador [], pero cabe señalar que [
después con] debe ir precedido de espacios adicionales
Al probar una cadena, se recomienda que todas las variables estén entre comillas dobles para evitar la situación en la que solo haya parámetros de prueba y no haya contenido de prueba cuando el contenido de la variable esté vacío.
A continuación utilizamos ejemplos para demostrar las tres precauciones anteriores:
-nordestey
-eqEn consecuencia, a veces podemos prescindir de
!Operación
$ i=5$ si prueba $i -eq 5; entonces repite SÍ; de lo contrario, repite NO; luego repita SÍ; de lo contrario, repita NO;
usar
[ ]puede reemplazar
prueba, se verá mucho más “hermoso”
$ si [ $i -eq 5 ]; entonces repite SÍ; si no, repite NO;
Recuerde agregar algunas variables de cadena
,Recordar[después con
]Añade un espacio extra antes
$ str=$ if [ $str = prueba]; entonces echo SÍ; else echo NO; [: falta `]'NO$ if [ $str = prueba ]; bash: [: =: operador unario esperadoNO$ si [ $str = prueba ]; entonces haga eco SÍ; de lo contrario, haga eco NO;
En este punto, se presenta la lista de comandos a continuación. De hecho, ya la hemos usado anteriormente, es decir, una combinación de múltiples comandos de prueba.
&&,
||y
!Una secuencia de comandos combinados. Esta secuencia de comandos reemplaza efectivamente
si/entoncesestructura de rama condicional. No es difícil pensar en las siguientes preguntas de opción múltiple que hacemos a menudo en la programación en lenguaje C (un ejemplo muy aburrido, pero significativo): ¿Se imprimirá lo siguiente?
j, si se imprime, ¿qué se imprimirá?
#include <stdio.h>int main(){ int i, j; i=5;j=1 si ((i==5) && (j=5)) printf(%dn, j); devolver 0;}
Es fácil saber que se imprimirá el número 5 porque
yo==5Esta condición se mantiene y posteriormente
&&Para juzgar si se cumple toda la condición, tenemos que hacer un juicio posterior, pero este juicio no es un juicio convencional, sino primero
jModifíquelo a 5 y luego conviértalo a un valor verdadero, de modo que la condición sea verdadera y se imprima 5. Por lo tanto, esta oración se puede interpretar como: Si
ies igual a 5, entonces pon
jAsigne un valor de 5 si
jes mayor que 1 (porque ya era cierto antes), luego imprima
jvalor. Úselo de esta manera
&&La declaración de juicio concatenada reemplaza dos
siDeclaración de rama condicional.
Es precisamente en base a las propiedades únicas de las operaciones lógicas que podemos pasar
&&,
||reemplazar
si/entoncesEspere la estructura de rama condicional, generando así una lista de comandos.
Las reglas de ejecución de la lista de comandos se ajustan a las reglas de operación de las operaciones lógicas.
&&Para los comandos conectados, si el primero regresa correctamente, se ejecutará el siguiente comando; de lo contrario, utilice;
||Si los comandos conectados regresan con éxito, los comandos posteriores no se ejecutarán y viceversa.
$ ping -c 1 www.lzu.edu.cn -W 1 && echo =======conectado========
Surge una pregunta muy interesante, que es la que hemos mencionado anteriormente: ¿por qué el programa C debería ser
principal()¿La función devuelve 0 al final? Si no, ¿cuáles serían las consecuencias de poner este tipo de programa en la lista de comandos? Escriba usted mismo un programa C simple y luego colóquelo en la lista de comandos para verlo.
A veces se utiliza una lista de comandos en su lugar.
si/entoncesLa estructura de rama condicional puede guardar algo de código y hacer que el programa sea más hermoso y fácil de leer, por ejemplo:
#!/bin/bashecho $#echo $1if [ $# -eq 1 ] && (echo $1 | grep ^[0-9]*$ >/dev/null); luego echo YESfi
Nota: El ejemplo anterior requiere que el número de parámetros sea 1 y el tipo sea numérico.
Más
salida 1, omitiremos
si/entoncesestructura
#!/bin/bashecho $#echo $1! ([ $# -eq 1 ] && (echo $1 | grep ^[0-9]*$ >/dev/null)) && salida 1echo SÍ
Después de este procesamiento, solo se requiere una simple línea de código para juzgar los parámetros del programa y se vuelve más hermoso.
Esta sección presenta operaciones lógicas, pruebas condicionales y listas de comandos en la programación Shell.