Declaraciones condicionales en scripts de shell
Directorio de artículos
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
输入有误!