Aprenda en secreto las declaraciones condicionales de los scripts de shell

1. Operación de prueba condicional

1. Comando de prueba ------ prueba

  • Puede probar condiciones específicas y determinar si la condición se establece en función del valor de retorno (el valor de retorno es 0 significa que la condición está establecida, de lo contrario, no).
使用test命令测试时,有两种形式:(常用格式二)
格式一:test 条件表达式
格式二:[ 条件表达式 ]
#方括号两边与条件表达式之间需要至少一个空格进行分隔

2. Prueba de archivos

  • De acuerdo con el nombre de ruta dado, determine si corresponde a un archivo o directorio, o si tiene la autoridad correspondiente.
格式:[ 操作符 文件或目录 ]
Operadores de uso común efecto
-re Prueba si es un directorio (Directory)
-mi Pruebe si el directorio o archivo existe (existe)
-F Prueba si es un archivo (Archivo)
-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)

Inserte la descripción de la imagen aquí

3. Comparación de valores enteros

  • Se utiliza para comparar el tamaño de dos valores enteros.
格式:[ 整数变量1 操作符 整数变量2 ]
Operadores de uso común efecto símbolo
-eq igual ==
-nacido no igual a ! =
-gt mas que el >
-lt Menos que <
-la Menos que o igual a
-dar mayor o igual a

Ejemplo 1:

ps aux |wc -l
[ $(ps aux| wc -l) -lt 200 ] && echo "系统进程状况良好" || echo "后台程序太多,请及时清理"

Inserte la descripción de la imagen aquí
Ejemplo 2:

Free=$(free -m | grep "Mem" | awk '{print $4}')
[ $Free -lt 1024 ] && echo "空闲内存所剩不多,只剩下${Free}MB"

Inserte la descripción de la imagen aquí

4. Comparación de cadenas

  • La cadena se puede utilizar para comprobar si la entrada del usuario, el entorno del sistema, etc., cumplen las condiciones
  • En scripts de shell interactivos, se utiliza para determinar si los parámetros posicionales introducidos por el usuario cumplen los requisitos.
Opciones comunes efecto
= La primera cadena es la misma que la segunda cadena
! = El primer carácter no es igual que la segunda cadena, "!" Significa negación
-con El contenido de la cadena está vacío
格式1:
[  字符串1  =  字符串2 ][  字符串1  ==  字符串2 ] 
[  字符串1  !=  字符串2 ]

格式2:
[  -z  字符串 ]		#检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串

Inserte la descripción de la imagen aquí

5. Prueba de lógica

  • Se utiliza para juzgar la dependencia entre dos o más condiciones.
常用的操作符:
-a或&& :逻辑与,“而且”的意思,前后条件需都成立
-o或|| :逻辑或,“或者”的意思,只需前后条件中一个成立
! :逻辑否,“不”的意思

格式1:[  表达式1  ]  操作符  [  表达式2  ]  
格式2:命令1  操作符  命令2
示例:
a=5
[ $a -ne 1 ] && [ $a != 2 ]	等同于	[ $a -ne 1 -a $a != 2 ]

#、&&、||操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错
[[ $a -ne 1 && $a != 2 ]]
[ 2 -lt 3 ] && echo true || echo false
[ 2 -ge 3 ] && echo true || echo false

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

小实验:
vim pinghost.sh
#!/bin/bash
ping -c 3 -i 0.5 -W 2 $1 &> /dev/null && echo "$1 online" || echo "$1 off"

-c:发送包的个数
-i:发送包的间隔时间
-W:超时时间
-w:多少秒后停止 ping 命令操作

Inserte la descripción de la imagen aquí

Dos, si declaración

1. Estructura de rama única

  • La operación correspondiente se ejecutará solo cuando se establezca la condición, de lo contrario no se ejecutará.
格式:
if 条件测试操作
then
命令序列
fi

Inserte la descripción de la imagen aquí

演示1:正常的if语句格式,看起来整洁,一目了然,如果报错提示行数容易发现。(推荐使用)
if [ 3 -gt 2 ]
 then
 echo "ok"
fi

演示2:都集中在一行,用“;”隔开,报错不易发现。(如果你认为自己不会出错,可以试试)
if [ 3 -gt 2 ]; then echo "ok"; fi

演示3:由条件测试拼凑而。(同2)
[ 3 -gt 2 ] && echo "ok"

Inserte la descripción de la imagen aquí

2. Declaración if de doble rama

  • Realizar diferentes operaciones para las dos situaciones
格式:
if 条件测试操作
then
命令序列 1
else
命令序列 2
fi

Inserte la descripción de la imagen aquí

这里就拿刚才上面逻辑测试里确定做成一个
vim pinghost.sh
#!/bin/bash
ping -c 3 -i 0.5 -W 2 $1 &> /dev/null
if [ $? -eq 0 ]
then
	echo "$1 online"
else
	echo "$1 off"
fi

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

3. Declaración if de varias ramas

  • De acuerdo con las características de si, se usa en anidamiento, y se hacen múltiples juicios.
格式:
if 条件测试操作 1
then
命令序列 1
elif 条件测试操作 2
then
命令序列 2
[else]
[命令序列 3]
fi

Inserte la descripción de la imagen aquí

vim dan.sh
#!/bin/bash
#
read -p "请输入您的积分: " score
if [ $score -ge 6000 ]
then
  echo "您在本店是至尊VIP!买东西享5折优惠!" 

  elif [ $score -ge 4000 ] && [ $score -le 5999 ]
  then
    echo "您在本店是顶级VIP!买东西享7折优惠!"

  elif [ $score -ge 2000 ] && [ $score -le 3999 ]
  then
    echo "您在本店为高级VIP!买东西享8折优惠!"

  elif [ $score -ge 1 ] && [ $score -le 1999 ]
  then
    echo "您在本店为普通VIP,买东西享9.5折优惠"

  elif [ $score -eq 0 ]
  then
    echo "您还未在本店购买过东西,没有任何优惠"
fi

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Tres, declaración de rama de caso

1. La estructura del enunciado del caso

  • Usado para variables con múltiples valores, ejecute diferentes comandos para cada valor
  • Similar a si,
case 变量值 in
模式 1)
命令序列 1
;;
模式 2)
命令序列 2
;;
* )
默认命令序列
esac

Cuando se utilizan declaraciones de rama de caso, hay varias características dignas de mención, como se describe a continuación

  • El final de la línea del caso debe ser la palabra "en", y cada patrón debe terminar con un corchete de cierre ")".
  • El doble punto y coma ";;" indica el final de la secuencia de comandos.
  • En la cadena de patrón, se pueden usar corchetes para indicar un rango continuo, como "[0-9]", y el símbolo de barra vertical "|" también se puede usar para indicar o, como "A | B".
  • El último "*)" representa el modo predeterminado y el * es equivalente a un comodín.
    Inserte la descripción de la imagen aquí

2. Ejemplos de aplicación

(1) Ingrese la puntuación y confirme la evaluación

vim score.sh
#!/bin/bash
#
read -p "请输入您的分数(0-100): " score
[[ $score -ge 85 && $score -le 100 ]] && a="great"
[[ $score -ge 60 && $score -lt 85 ]] && a="standard"
[[ $score -ge 0 && $score -lt 60 ]] && a="false"
case $a in
great)
        echo "$score 分,优秀!"
;;
standard)
        echo "$score 分,合格!"
;;
false)
        echo "$score 分,不合格!"
;;
*)
        echo "输入有误!"
esac

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

(2) Escritura de scripts de servicio del sistema

vim /etc/init.d/firewalld.sh
#!/bin/bash
#
case $1 in
start)
        echo "正在开启防火墙..."
        systemctl start firewalld.service
  if [ $? -eq 0 ]
  then
  echo "开启成功"
  else
  echo "开启失败"
  fi
;;
stop)
        echo "正在关闭防火墙..."
        systemctl stop firewalld.service
  if [ $? -eq 0 ]
  then
  echo "已关闭"
  else
  echo "关闭失败"
  fi
;;
restart)
        $0 stop
        $0 start
;;
status)
  echo "防火墙状态如下:"
        systemctl status firewalld.service
;;
* )
        echo "脚本的用法: $0 {start|stop|status|restart}"
esac

Guión experimental:
Inserte la descripción de la imagen aquí
Guión de prueba:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_51326240/article/details/111294850
Recomendado
Clasificación