Programación Linux Bash Shell (8): ejemplos y declaraciones de juicio condicional
En la sección anterior , aprendimos sobre los comandos relevantes para la interceptación y procesamiento de cadenas, y podemos filtrar e interceptar el flujo de datos de salida del comando. Al comienzo de esta sección, es la parte más crítica de la programación de Bash Shell: sentencias de juicio condicional y control de flujo. En esta sección, primero estamos familiarizados con los diversos tipos y formas de juicio condicional.
Gramática básica del juicio condicional
Existen principalmente dos sintaxis básicas para el juicio condicional: comandos basados en la línea de test
comandos y estilos condicionales que son más adecuados para incorporar declaraciones de control de procesos.
- comando de prueba El comando de
prueba ejecuta la sentencia de juicio condicional en forma de una línea de comando sin ninguna salida estándar. El resultado de la ejecución de la sentencia se almacena en una variable predefinida$?
( tenga en cuenta que el valor de $? es similar al valor de retorno del programa, no a los datos booleanos , $? 0 es verdadero, 1 es falso ), puede verse directamente conecho
comandos, o puede ser llamado por múltiples relaciones lógicas de comando, lo cual está más en línea con los hábitos del usuario, pero es inconveniente de usar en scripts de Shell, y generalmente no se recomienda su uso en Shell
test 条件判断语句
#为了观察实际效果,一般使用echo命令查看$?预定义变量
echo $?
#0为真,1为假
#例如:(判断语句的具体分类在下面讲到)
test -e Hello_World.sh
echo $?
-
Con
[]
estilos condicionales incluidosLa función de usar la
[]
condición incluida para juzgar la expresión es latest
misma que la del comando. No adopta la estructura imperativa. Puede integrarse fácilmente en la declaración de control del proceso como condición. El valor de retorno también está en la variable predefinida$?
. Excepto por la forma diferente, el resto estest
exactamente igual que el comandoNota: [] debe tener espacios en ambos lados del interior, de lo contrario se informará un error cuando se ejecute el comando
[ 条件判断语句 ]
#同样使用echo命令查看条件判断语句结果
echo $?
#例如:(判断语句的具体分类在下面讲到)
[ -e Hello_World.sh ]
echo $?
Tipo de sentencia de juicio condicional
Juzgando por tipo de archivo
Agregue el nombre del archivo después de la opción para determinar si el tipo de archivo (si existe) cumple con las condiciones. Si el archivo no existe, devolverá falso, y si cumple con las condiciones, devolverá verdadero. El identificador de tipo de archivo específico es similar al primero del atributo de archivo en el resultado del comando ls.
[选项 文件名]
#echo #?
Opciones | efecto |
---|---|
-si | Determine si el archivo (si existe (lo mismo a continuación)) es un archivo de dispositivo de bloque (es verdadero (lo mismo a continuación)) |
-C | Determinar si el archivo es un archivo de dispositivo de caracteres |
-re | Determine si el archivo es un archivo de directorio |
-mi | existe solo juzga si el archivo existe |
-F | archivo Juzgar si el archivo es un archivo normal |
-L | Determine si el archivo es un archivo de enlace simbólico |
-pags | Determine si el archivo es un archivo de canalización |
-s | Determine si el archivo no está vacío (no vacío es cierto) |
-S | Determine si el archivo es un archivo de socket |
A juzgar por los permisos de archivo
También agregue el nombre del archivo después de la opción, si el permiso es verdadero, si no hay permiso o el archivo no existe, es falso. (Juzgar es la autoridad del usuario actual sobre este archivo)
Opciones | efecto |
---|---|
-r | Determine si el archivo tiene permiso de lectura |
-w | Determine si el archivo tiene permiso de escritura |
-X | Determine si el archivo tiene permiso de ejecución |
-u | Determine si el archivo tiene permisos SUID |
-gramo | Determine si el archivo / directorio tiene permisos SGID |
-k | Determine si el directorio tiene permisos SBIT |
Compara la información de dos archivos
Formato: Archivo 1 [Opción] Archivo 2
Opciones | efecto |
---|---|
-Nuevo Testamento | más reciente que juzga si la última hora de modificación del archivo 1 es posterior al archivo 2, y posterior es verdadera (0) |
-Antiguo Testamento | mayor que Juez si la última hora de modificación del archivo 1 es anterior al archivo 2, lo cual es cierto (0) |
-ef | Determine si los números de Inode de los dos archivos son los mismos, que es similar a si los dos archivos son iguales |
- Entre ellos, el
Inode
número es el número de serie que identifica el archivo. Dos archivos diferentes pueden tener el mismo nombre, pero el número de Inode no puede ser el mismo. Si los dos archivos tienen una relación rígida (guardar como copia, actualización sincronizada), el número de Inode de los dos archivos será el mismo , El resto son diferentes - Dos archivos vinculados no tienen signos, excepto el mismo número de Inode. Puede utilizar este método de evaluación para juzgar el vínculo físico
Compara dos enteros
Si se trata de dos variables, no es necesario declararlo en formato entero, sintaxis: entero 1 [opción] entero 2
Opciones | efecto |
---|---|
-eq | igual Determina si dos enteros son iguales |
-nacido | no es igual Determina si dos números enteros no son iguales |
-gt | mayor que juzgar si el entero 1 es mayor que el entero 2 |
-lt | menor que juzgar si el entero 1 es menor que el entero 2 |
-dar | mayor / igual juzgar si el entero 1 es mayor o igual que el entero 2 |
-el | menor / igual juzgar si el entero 1 es menor o igual que el entero 2 |
Determinar la correlación de cadenas
La gramática está incluida en las opciones. Nota: La comparación de las dos cadenas debe tener espacios en ambos lados del predicado relevante, de lo contrario, el valor de retorno será verdadero de todos modos.
Opciones | efecto |
---|---|
-z cadena | Determine si la cadena está vacía |
-n cadena | Determine si la cadena no está vacía |
Cadena 1 == cadena 2 | Determinar si dos cadenas son iguales |
Cadena 1! = Cadena 2 | Determinar si dos cadenas no son iguales |
- Cuando la cadena es una variable, si la variable no está definida, también se trata como una cadena vacía.
La relación lógica entre las dos condiciones de juicio
Cuando utilice dos condiciones de juicio al mismo tiempo, preste atención a la relación lógica entre ellas, el formato de las dos condiciones de juicio: condición 1 [opción] condición 2
Opciones | efecto |
---|---|
-una | AND lógico, ambas condiciones son verdaderas |
-Los | OR lógico, si una de las dos condiciones es verdadera |
! [Condiciones] | Negación lógica, invierta el resultado del juicio ( tenga en cuenta que ! hay un espacio entre la condición y la condición ) |
Declaración de juicio condicional utilizada junto con múltiples símbolos de lógica de comando
Para conocer la secuencia de múltiples comandos y caracteres lógicos, consulte Programación de shell Bash de Linux (3): redirección, múltiples secuencias de comandos, comodines, símbolos especiales
De hecho, la forma de juzgar si el comando anterior es ejecutado por múltiples secuencias de comandos y símbolos lógicos es juzgar si $?
el valor de la variable predefinida es 0, por lo que puede tratar directamente la declaración de juicio condicional como un comando y agregarla a la declaración de secuencia de comando múltiple, y el juicio condicional es verdadero Equivalente a la correcta ejecución del enunciado anterior.
Ejemplo
Ejemplo 1. Determine si el archivo existe:
[ -e ./test.sh ] && echo "File exists" || echo "File not found"
#条件判断语句方括号内侧必须有空格
#该命令执行,若文件存在,显示"File exists";否则显示"File not found"
Ejemplo 2: use la lógica de comandos múltiples para construir un programa de proporción de una sola línea:
#以下为test5.sh中的内容
#!/bin/bash
#Author:Zheng
read -p "a= " a
read -p "b= " b #通过键盘读入a,b数据,请参阅(四)
[ $a -lt $b ] && echo "a<b" || echo "a>=b"
Ejemplo 3: Sentencia de juicio de condiciones múltiples: juzgue si la variable de entrada está vacía y el valor es menor que 10
#以下为test6.sh中内容
#!/bin/bash
#Author: Zheng
read -p "Input a: " a
#若a非空且小于10,则输出Yes
[ -n $a -a $a -lt 10 ] && echo "Yes" || echo "No"
#此脚本中未加入判断a是否为整数的条件,留待改进
índice
En la siguiente sección, Linux Bash Shell Programming (9): Declaración de control de flujo (Parte 1) Declaración de rama (si, caso) , aprenderemos la declaración de control de flujo Bash
La última sección, programación Linux Bash Shell (7): intercepción y procesamiento de cadenas (cut, printf, awk, sed)