Declaración condicional del script Shell (¡detallado! Hay preguntas de muestra jajajaja)

Declaraciones condicionales en scripts de shell

1. Prueba de estado

1.comando de prueba

Pruebe la validez de una expresión específica, devuelva 0 si es verdadera y devuelva un valor distinto de cero si no es verdadera

格式1:test 条件表达式
格式2:[ 条件表达式 ] 

Nota: Debe haber al menos un espacio entre los dos lados de la expresión condicional y los corchetes.

2. Prueba de archivos

Probar atributos relacionados con archivos o directorios o si tienen los permisos correspondientes

[ 操作符 文件或目录 ]

Operadores de prueba de uso común

Operador función
-D Prueba si es un directorio (Directory)
-mi Prueba 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 Pruebe si el usuario actual tiene permiso para ejecutar (eXcute)
[root@localhost ~]#[ -d /mnt ] #测试是否为目录
[root@localhost ~]#echo $? #查看上一条命令的执行结果,返回值为0时表示结果为真
0
[root@localhost ~]#ls
anaconda-ks.cfg        home                  pjlx.sh   survey.sh  文档
backup-2020-12-20.tgz  initial-setup-ks.cfg  prj.sh    test31     下载
cal1.sh                jc.sh                 pxsb.sh   test34     音乐
cal.sh                 kyzjsjx.sh            pxsbx.sh  公共       桌面
ddysjx.sh              lx.sh                 qq.sh     模板
dysjx.sh               mybak.sh              sum1.sh   视频
first.sh               path1.sh              sum.sh    图片
[root@localhost ~]#[ -f first.sh ] #测试first.sh是否为文件
[root@localhost ~]#echo $? #查看上一条命令的执行结果,返回值为0时表示结果为真
0
[root@localhost ~]#[ -d first.sh ] #测试first.sh是否为目录
[root@localhost ~]#echo $? #查看上一条命令的执行结果,返回值为0时表示结果为真
1
[root@localhost ~]#[ -r first.sh ] #测试first.sh是否有读取权限
[root@localhost ~]#echo $? #查看上一条命令的执行结果,返回值为0时表示结果为真
0
[root@localhost ~]#[ -f first.sh ] && echo "yes"
yes #测试first.sh是否为文件,满足条件时输出yes

3. Comparación de valores enteros

formato

[ 整数1 操作符 整数2 ]

Operadores de comparación comunes

Operador Rol / función
-eq Igual
-nacido -ne: No es igual
-gt -gt: mayor que
-lt -lt: menor que (menor que)
-la -le: Menor o igual a (Menor o igual)
-dar -ge: mayor o igual
[root@localhost ~]#free -m #查看内存使用情况,以MB为单位
              total        used        free      shared  buff/cache   available     #总物理内存为1823MB        #空闲内存为1116MB
Mem:           1823         305        1116           9         401        1308
Swap:          4095           0        4095
[root@localhost ~]#free -m | grep "Mem" | awk '{print $4}'
1116 #以MB为单位查看内存,筛选出Mem那行,并打印出第四列内容到屏幕上
[root@localhost ~]#freemem=$(free -m | grep "Mem" | awk '{print $4}')
[root@localhost ~]#echo $freemem 
1116 #把以上那段得出的结果赋值给freemem,然后查看其变量值
[root@localhost ~]#[ $freemem -gt 1024 ] && echo "$freemem"MB
1116MB #如果变量值大于1024,输出其变量值MB,""之中可引用其他变量,此处也用作分隔后面字符

4. Operaciones de coma flotante

1) bc: calculadora bash incorporada

Bash no admite operaciones de punto flotante, solo operaciones con números enteros. Esta es una gran limitación. Si necesita realizar operaciones de punto flotante, debe utilizar bc (calculadora bash incorporada) o awk para el procesamiento.

Ingrese bc para ingresar a la calculadora, ingrese salir para ingresar o directamente Ctrl D para salir de la calculadora.

[root@localhost ~]#bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
12 * 2.4
28.8
2.4 * (2 + 9)
26.4
quit

2) Cita bc

Incluyendo suma, resta, multiplicación y división

[root@localhost ~]#v1=$(echo "2.4*2"|bc)
[root@localhost ~]#echo $v1
4.8
[root@localhost ~]#v2=$(echo "3.6/1.5"|bc)
[root@localhost ~]#echo $v2
2
[root@localhost ~]#v2=$(echo "scale=3; 3.6/1.5"|bc)
[root@localhost ~]#echo $v2 #scale=3表示输出结果包含3位小数
2.400
[root@localhost ~]#v3=$(echo "3.6+1.5"|bc)
[root@localhost ~]#echo $v3
5.1
[root@localhost ~]#v3=$(echo "3.6-1.5"|bc)
[root@localhost ~]#echo $v3
2.1

3) awk: herramienta de procesamiento de datos simple

Awk es adecuado para procesar datos de texto pequeño, su formato:

awk '条件类型1 {操作1} 条件类型2 {操作2} ...' filename

Utilice awk para sumar, restar, multiplicar y dividir:

#加法
[root@localhost ~]#f=$(awk 'BEGIN{print 3.6+1.5 }')
[root@localhost ~]#echo $f
5.1
[root@localhost ~]#echo "3.6+1.5=$f"
3.6+1.5=5.1
#减法
[root@localhost ~]#v4=$(awk 'BEGIN{print 3.6-1.5 }')
[root@localhost ~]#echo "3.6-1.5=$v4"
3.6-1.5=2.1
#乘法
[root@localhost ~]#v4=$(awk 'BEGIN{print 3.6*1.5 }')
[root@localhost ~]#echo "3.6*1.5=$v4"
3.6*1.5=5.4
#除法
[root@localhost ~]#v4=$(awk 'BEGIN{print 3.6/1.5 }')
[root@localhost ~]#echo "3.6/1.5=$v4"
3.6/1.5=2.4

Utilice awk para analizar y procesar datos

Saque la cuenta y la IP de inicio de sesión, y separe la cuenta y la IP con [Tab], de la siguiente manera

Donde $ 1 es el número de cuenta y $ 3 es la IP

[root@localhost ~]#last -n 3 #利用last取出登录者数据,取出前三行
root     pts/0        192.168.2.1      Wed Dec 23 13:28   still logged in   
reboot   system boot  3.10.0-693.el7.x Wed Dec 23 13:27 - 17:36  (04:09)    
root     pts/0        192.168.2.1      Tue Dec 22 08:34 - down   (08:31)    

wtmp begins Wed Nov 11 19:55:40 2020
[root@localhost ~]#last -n 3 | awk '{print $1 "\t" $3}'
root	192.168.2.1
reboot	boot
root	192.168.2.1

wtmp	Wed

5. Comparación de cadenas

1) Formato

格式1:[ 字符串1 = 字符串2 ] 
      [ 字符串1 != 字符串2 ] 
格式2: [ -z 字符 ]

2) Operadores de prueba de uso común

=:字符串内容相同
!=:字符串内容不同, !号表示相反的意思
-z:字符串内容为空
-n:检测字符串是否存在

Por ejemplo:

[root@localhost ~]#ABC=123
[root@localhost ~]#echo $ABC
123
[root@localhost ~]#[ $ABC = 123 ] && echo "成立" #判断ABC的值是否和字符串123相同,相同输出“成立”
成立
[root@localhost ~]#[ $ABC != 123 ] && echo "成立" || echo "不成立"
不成立 #||逻辑或,上一条命令执行失败的时候执行后面的命令

6. Prueba de lógica

1) Formato

格式1:[ 表达式1 ] 操作符 [ 表达式2 ]
格式2:命令1 操作符 命令2

2) Operadores de prueba de uso común

Operador función
-a 或 && Lógico y medio
-o o || Lógico o, o significado
! Negación lógica

Nota: ①Use -a o -o en el mismo corchete, y && o || entre dos corchetes

Los operadores ② &&, || normalmente pueden existir en la estructura de juicio condicional [[]], pero si aparecen en la estructura [], se informará un error

③ Debe haber al menos un espacio entre el operador y la expresión en ambos lados, de lo contrario se informará un error

Por ejemplo:

a=3
[ $a -ne 1 ] &&  [$a != 2 ]等同于 [ $a -ne 1 -a $a != 2 ]

[[ $a != 1 && $a != 2 ]]
[[ 5 -lt 9 ]] && echo "true" || echo "false"
[[ 3 -ge 5 ]] && echo "true" || echo "false"
[root@localhost ~]#[ $a -ne 1 ] &&  [ $a !=2 ] #=和2之间无空格导致报错
-bash: [: 3: 期待一元表达式
[root@localhost ~]#[ $a -ne 1 ] &&  [ $a != 2 ]
[root@localhost ~]#a=3
[root@localhost ~]#[ $a -ne 1 ] &&  [ $a != 2 ] #判断a的值不等于1且不等于2
[root@localhost ~]#echo $? #上一个命令成立返回0,不成立返回其他值
0
[root@localhost ~]#[[ $a != 1 && $a != 2 ]]
[root@localhost ~]#echo $?
0
[root@localhost ~]#[[ 5 -lt 9 ]] && echo "true" || echo "false"
true #判断5是否小于9,成立时输出true,||前面的不成立时输出false
[root@localhost ~]#[[ 3 -ge 5 ]] && echo "true" || echo "false"
false #判断3是否大于或等于5,成立输出true,||前面不成立时输出false

Dos, si declaración

1. Estructura de rama única

if  条件测试操作
then  
  命令序列
fi
  • Tres formas de expresión
if [ 3 -gt 2 ]
then
    echo "ok"
fi


if [ 3 -gt 2 ];then echo "ok";fi

[ 3 -gt 2 ] && echo "ok"

2. Declaración if de doble rama

if 条件测试操作
then
  命令序列1
else
  命令序列2
fi

Por ejemplo:

[root@localhost ~]#vim ping.sh
[root@localhost ~]#chmod +x ping.sh 
[root@localhost ~]#./ping.sh 192.168.100.100
192.168.100.100 off
[root@localhost ~]#./ping.sh 192.168.2.3
192.168.2.3 online
[root@localhost ~]#cat ping.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

-c: el número de paquetes enviados
-i: el intervalo entre el envío de paquetes para probar
-w: tiempo de espera

Envíe tres paquetes con un intervalo de 0,5 segundos y un período de tiempo de espera de 2 segundos. Toda la información de salida se enviará al archivo de agujero negro sin tiempo de espera. Cuando la ejecución sea exitosa, $? = 0, la IP se enviará en línea, que está en linea.

De lo contrario, el archivo de agujero negro se perderá después del tiempo de espera de 2 segundos y la IP de salida se cerrará

3. Declaración if de varias ramas

if 条件测试操作1
then
  命令序列1
elif 条件测试操作2
then
  命令序列2
else
  命令序列3
fi

Por ejemplo:

[root@localhost ~]#vim chengji.sh 
[root@localhost ~]#cat chengji.sh 
#!/bin/bash
#
read -p "请输入您的分数(1-100): " score
if [ $score -ge 85 ] && [ $score -le 100 ]
then
  echo "优秀!" 

  elif [ $score -ge 75 ] && [ $score -le 84 ]
  then
    echo "还不错,继续努力!"

  elif [ $score -ge 60 ] && [ $score -le 74 ]
  then
    echo "及格,还需加油!"

  elif [ $score -ge 1 ] && [ $score -le 59 ]
  then
    echo "没及格,在错误中进步,你可以的!"
fi

[root@localhost ~]#chmod +x chengji.sh 
[root@localhost ~]#./chengji.sh 
请输入您的分数(1-100): 98
优秀!
[root@localhost ~]#./chengji.sh 
请输入您的分数(1-100): 83
还不错,继续努力!
[root@localhost ~]#./chengji.sh 
请输入您的分数(1-100): 70
及格,还需加油!
[root@localhost ~]#./chengji.sh 
请输入您的分数(1-100): 52
没及格,在错误中进步,你可以的!

Tres, declaración de caso

Estructura de múltiples ramas 1.case

case 变量值 in
模式1)
     命令序列1
     ;;
模式2)
     命令序列2
     ;;
.....
*)
     默认命令序列
esac

Nota:

  • El final de la línea del caso debe ser la palabra "en", y cada patrón debe terminar con un paréntesis 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]"; el símbolo de barra vertical "|" también se puede usar para indicar o, como "AIB"
  • El " )" al final representa el modo predeterminado, que es equivalente a un comodín.

2. Ejemplos

Por ejemplo:

[root@localhost ~]#vim chengjicase.sh 
[root@localhost ~]#cat chengjicase.sh 
#!/bin/bash
read -p "请输入您的分数(0-100) : " score
if [ $score -le 100 -o $score -ge 0 ];then
           [[ $score -ge 80 && $score -le 100 ]] && a="great"
           [[ $score -ge 60 && $score -lt 80 ]] && a="standard"
           [[ $score -ge 0 && $score -lt 60 ]] && a="false"
           case $a in
           great)
	           echo " $score分,优秀! "
               ;;
           standard)
               echo " $score分,合格! "
               ;;
           false)
               echo " $score分,不合格! "
               ;;
               *)
               echo "输入有误!"
esac
fi
[root@localhost ~]#chmod +x chengjicase.sh 
[root@localhost ~]#./chengjicase.sh 
请输入您的分数(0-100) : 98
 98分,优秀! 
[root@localhost ~]#./chengjicase.sh 
请输入您的分数(0-100) : 78
 78分,合格! 
[root@localhost ~]#./chengjicase.sh 
请输入您的分数(0-100) : 52
 52分,不合格! 
[root@localhost ~]#./chengjicase.sh 
请输入您的分数(0-100) : 111
输入有误!

Supongo que te gusta

Origin blog.csdn.net/qq_35456705/article/details/111873520
Recomendado
Clasificación