Linux - Programación Shell - Declaración condicional


Prefacio

  • Ya hemos aprendido a escribir un script de shell relativamente simple: cada instrucción se ejecuta en secuencia, para realizar el proceso automático de "procesamiento por lotes"
  • Sin embargo, hay más estructuras secuenciales "únicas" escritas así. ¿Te resultaría más fácil? De esta manera, el guión está demasiado mecanizado, como una tubería, ¡no lo suficientemente "inteligente"!
  • Entonces, ¿cómo podemos lidiar con calma con las tareas complejas del sistema?
  • Aprendamos a realizar operaciones de prueba condicionales, y mediante el uso correcto de las sentencias if, para que el script de shell tenga cierta capacidad de "juicio", para completar diferentes tareas de gestión de acuerdo con diferentes condiciones.

1. Prueba de estado

1. Prueba comando-prueba

  • Para que el programa de script de shell tenga un cierto "inteligente", el primer paso es distinguir entre diferentes situaciones para determinar qué operación realizar
  • El entorno Shell juzga si la ejecución es exitosa de acuerdo con el valor de estado de retorno ($?) Después de que se ejecuta el comando . Cuando es 0, es exitosa (indicando que la condición está establecida), de lo contrario (valor distinto de cero) indica falla o excepción.
基本格式
test 条件表达式
或
[ 条件表达式 ]        ##此法更为常用,记住留有空格

2. Prueba de archivos

基本格式:
[ 操作符 文件或目录 ]

echo &?
##0表示条件成立,反之亦然
可以结合&&使用,比if语句执行效率更高
  • Operadores de prueba de uso común (de vuelta a mí! Fde, rwx )
Opciones de operación comunes Explicación
-F Prueba si es un archivo (Archivo)
-re Prueba si es un directorio (Directory)
-mi Pruebe si el directorio o archivo existe (existe)
-r Pruebe si el usuario actual tiene permiso para leer (Leer)
-w Pruebe si el usuario actual tiene permiso para escribir (Escribir)
-X Prueba si el usuario actual tiene permiso para ejecutar (ejecutar)
  • Los ejemplos son los siguientes
    marca
  • También puede usar "[[]]" para realizar pruebas condicionales, aquí se usa "||"
    marca
[root@localhost ~]# useradd xuer
[root@localhost ~]# echo "123123" | passwd --stdin xuer
更改用户 xuer 的密码 。
passwd:所有的身份验证令牌已经成功更新。
##新建一个用户用以测试用户权限
[root@localhost ~]# cd /
[root@localhost /]# touch xcf1.txt
[root@localhost /]# su - xuer
上一次登录:三 12月 16 14:31:40 CST 2020pts/1 上
[xuer@localhost ~]$ [ -r /xcf1.txt ] && echo "YES"
YES
[xuer@localhost ~]$ [ -w /xcf1.txt ] && echo "YES"

##可以看到这里新用户只具有读取但是没有写入的权限

3. Comparación de valores enteros

基本格式:
[ 整数1 操作符 整数2 ]

##根据给定的两个整数值,判断前后关系,比如大、小,或等于
  • ¡Devuélveme!
Operadores comunes Explicación
-eq Igual
-nacido No es igual
-gt Mas grande que
-lt Menor que (Menor que)
-dar Mayor o igual
-la Menor o igual a (Menor o igual)
  • Ejemplo: Determine el tamaño de la memoria libre disponible actualmente (libre). Si la memoria actual es menor a 3333MB, se recomienda limpiarla a tiempo (tengo una configuración más alta para la máquina virtual aquí ==)
[root@localhost ~]# free -m        
              total        used        free      shared  buff/cache   available
Mem:           3774         278        3140           9         356        3237
Swap:          4093           0        4093

[root@localhost ~]# free -m | grep "Mem:" | awk '{print $4}'        
3140
[root@localhost ~]# abc=$(free -m | grep "Mem:" | awk '{print $4}')
[root@localhost ~]# echo $abc 
3139
[root@localhost ~]# [ $abc -lt 3333 ] && echo "当前内存为${abc}MB,请及时清理!"
当前内存为3139MB,请及时清理!

##查看当前内存大小
free 以kb单位显示  
free -m 显示MB  
free -h 仅centos7可用

4. Comparación de cadenas

  • Normalmente se utiliza para comprobar si la entrada del usuario y el entorno del sistema cumplen las condiciones
基本格式:
格式1
[ 字符串1 = 字符串2 ]
[ 字符串1 !=字符串2 ]
格式2
[ -z 字符串 ]
Operadores de prueba de uso común Explicación
= La primera cadena tiene el mismo contenido que la segunda cadena
! = ¡La primera cuerda es diferente de la segunda! Signo significa lo contrario
-con Compruebe si el contenido de la cadena está vacío. Las variables que no estén definidas o que no tengan asignado un valor nulo se tratarán como cadenas vacías.
[root@localhost ~]# read -p "思聪姓不姓王:(yes/no)" sicong
思聪姓不姓王:(yes/no)yes
[root@localhost ~]# [ $sicong = "yes" ] && echo "王思聪"
王思聪        ##若输出的是yes则输出王思聪,注意“=”两边的空格!
[root@localhost ~]# [ $sicong != "no" ] && echo "王思聪"
王思聪        ##若输入的不是no,则输出王思聪,注意“=”两边的空格!
[root@localhost ~]# [ -z $sicong ] && echo "王思聪"        ##检查是不是输入的是空格
[root@localhost ~]# 

5. Prueba de lógica

  • Determinar la dependencia entre dos o más condiciones.
  • Cuando la tarea del sistema depende de múltiples condiciones diferentes, el juicio se basa en si estas condiciones se establecen al mismo tiempo o solo se establece una de ellas.
基本格式:
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...
格式2:命令1 操作符 命令2 ...
  • Operadores de prueba comunes:
    • -a o &&: lógico y, que significa "y", tanto antes como después de que se cumplan las condiciones
    • -o o ||: OR lógico, "o" es decir, uno de los dos es suficiente
    • ! : Lógicamente no, solo cuando no se establece la condición especificada, se establece el resultado
  • Los operadores "&&", "||" normalmente pueden existir en la estructura de juicio condicional "[[]]", pero si aparecen en la estructura "[]", se informará un error
[root@localhost ~]# a=5        ##为变量赋值
[root@localhost ~]# [ $a -ne 1 ] && [ $a -lt 8 ]        ##5大于1或5小于8
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ $a -eq 1 ] && [ $a -lt 8 ]        ##5等于8?
[root@localhost ~]# echo $?
1        ##不成功
[root@localhost ~]# [ $a -ne 1 -a $a -lt 8 ]         ## -a的用法
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ $a -ne 1 && $a -lt 8 ]]        ## &&的用法
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ $a -ne 1 && $a -lt 8 ]] && echo abc123        ##不等于1且小于8就会输出abc123
abc123

Dos, si declaración

1. Declaración de rama única

marca

##基本格式
if 条件测试操作
    then  命令序列
fi
  • Por ejemplo
[root@localhost ~]# vim aaa.sh

#!/bin/bash

xcf="xcf.txt"        ##这里可以先设变量

if [ ! -e $xcf ]        ##若文件不存在,则执行下述命令
 then
        touch $xcf
        echo "$xcf创建成功"
fi
[root@localhost ~]# chmod +x abc1.sh 
[root@localhost ~]# . aaa.sh 
xcf.txt创建成功

2. Declaración de doble rama

marca

##基本格式
if 条件测试操作
	then  命令序列1
	else  命令序列2
fi
  • Si la condición es verdadera, ejecute el comando después de eso, ignore el else, hasta el final de fi (aquí continúe de acuerdo con la plantilla anterior)
    marca
    marca
  • Si la condición no está establecida, ignore entonces, salte a la secuencia de comando después de else, hasta el final de fi
    marca
    marca

2.3 Declaración de múltiples ramas

marca

##基本格式
if 条件测试操作1
	then  命令序列1
elif  条件测试操作2
	then  命令序列2
else
	命令序列3
fi
[root@localhost ~]# vim ccc.sh

#!/bin/bash

read -p "请输入你的成绩(0~100):" cj

if [ $cj -ge 80 ] && [ $cj -le 100 ]
        then
                echo "优秀"

elif [ $cj -ge 60 ] && [ $cj -le 80 ]
        then
                echo "良好"

else
                echo "不及格"

fi

marca


Tres, declaración de rama de caso

  • La declaración de caso se utiliza principalmente en los siguientes escenarios: cuando hay varios valores para cada variable, se debe ejecutar una secuencia diferente de comandos para cada valor.
  • La declaración if es para juzgar múltiples condiciones diferentes, y el caso juzga los diferentes valores de una variable.

1. Estructura

marca

##基本格式
case 变量值 in
模式1)
	命令序列1
	;;
模式2)
	命令序列2
	;;
	....
*)
	默认命令序列
esac
  • El final de la línea del caso debe ser la palabra en, y cada línea debe terminar con un corchete ")"
  • El doble punto y coma ";;" indica el final de la secuencia de comandos.
  • Puede utilizar corchetes "[]" para indicar un rango continuo; también puede utilizar "|" para indicar, como "A | B"
  • El último ") *" significa el modo predeterminado, si los valores anteriores no son los mismos, ejecute esta línea

2. Ejemplo de aplicación

[root@localhost ~]# vim ddd.sh

#!/bin/bash
#不说了我要去罚抄了

read -p "请输入你的分数: " sub

case $sub in

100)
        echo "恭喜你 逃过一劫"
        ;;

8[0-9]|9[0-9])
        echo "每道错题抄10遍"
        ;;

6[0-9]|7[0-9])
        echo "每道错题抄20遍"
        ;;

*)
        echo "呵呵 全部30遍"

esac

[root@localhost ~]# chmod +x ddd.sh 
[root@localhost ~]# vim ddd.sh
[root@localhost ~]# . ddd.sh 
请输入你的分数: 100
恭喜你 逃过一劫
[root@localhost ~]# . ddd.sh 
请输入你的分数: 98
呵呵 全部30遍
[root@localhost ~]# vim ddd.sh
[root@localhost ~]# . ddd.sh 
请输入你的分数: 99
每道错题抄10遍
[root@localhost ~]# . ddd.sh 
请输入你的分数: 77
每道错题抄20遍
[root@localhost ~]# . ddd.sh 
请输入你的分数: 55
呵呵 全部30遍
[root@localhost ~]# . ddd.sh 
请输入你的分数: 100
恭喜你 逃过一劫

Supongo que te gusta

Origin blog.csdn.net/weixin_51486343/article/details/111300594
Recomendado
Clasificación