Juicio condicional del script de shell

Formato de gramática de juicio condicional

  • Formato 1: prueba de expresión condicional
  • Formato 2: [expresión condicional]
  • Formato 3: [[Expresión condicional]] admite regular = ~

Nota
[] Y [[]] deben tener espacios en ambos lados

Parámetros relacionados con el juicio condicional

Determinar el tipo de archivo

Parámetro de juicio sentido
-e Determine si el archivo existe (cualquier tipo de archivo)
-F Determine si el archivo existeyEs un archivo normal
-D Determine si el archivo existe y es un directorio
-L Determine si el archivo existe y es un archivo de vínculo suave
-B Determine si el archivo existe y es un archivo de dispositivo de bloque
-S Determine si el archivo existe y es un archivo de socket
-C Determine si el archivo existe y es un archivo de dispositivo de caracteres
-pag Determine si el archivo existe y es un archivo de canalización con nombre
-s Determine si el archivo existe y no es un archivo vacío (con contenido)

Ejemplo

# 先判断zhu目录是否存在 存在则echo 不存在则创建
[root@maomao shell]# [ -d zhu ] && echo '存在' || mkdir zhu

# 前面加! 是非的意思
! -d 如果不存在 则创建
#!/bin/bash
back_dir=/usr/local/mysql_bcak	
if [ ! -d $back_dir ];then
       mkdir -p $back_dir
fi
       echo "开始备份..."

# -s 可以判断文件是否非空
[root@maomao shell]# [ -s free.sh ] && echo '非空' || echo "空"
非空
[root@maomao shell]# touch 123.txt
[root@maomao shell]# [ -s 123.txt ] && echo '非空' || echo "空"test -e file                    只要文件存在条件为真
[ -d /shell/dir1 ]             判断目录是否存在,存在条件为真
[ ! -d /shell/dir1 ]        判断目录是否存在,不存在条件为真
[[ -f /shell/1.sh ]]        判断文件是否存在,并且是一个普通的文件

Determinar los permisos de los archivos

Parámetro de juicio sentido
-r Si es legible por el usuario actual
-w Si el usuario actual puede escribir en él
-X ¿Es ejecutable por el usuario actual?
-u ¿Hay algo de riesgo de alto nivel?
-gramo Ya sea sgid, bit obligatorio de autoridad avanzada
-k ¿Hay un poco de permiso de alto nivel?

Determine los archivos nuevos y antiguos

Lo viejo y lo nuevo aquí se refieren aHora de modificación del archivo

Parámetro de juicio sentido
archivo1 -nt archivo2 Compare si el archivo1 es más nuevo que el archivo2
archivo1 -desde archivo2 Compare si el archivo1 es más antiguo que el archivo2
archivo1 -ef archivo2 Compare si es el mismo archivo o si se usa para determinar si el enlace físico apunta al mismo inodo
# 创建一个硬链接
[root@maomao shell]# ln free.sh free2.sh 

[root@maomao shell]# [ free.sh -ef free2.sh ]
[root@maomao shell]# echo $?
0

Juez entero

Parámetro de juicio sentido
-eq igual
-Nació Desigual
-gt mas que el
-lt Menos que
-dar mayor o igual a
-la Menos que o igual a

Ejemplo

#!/bin/bash
# 磁盘空间警报脚本
disk_use=`df -Th |grep '/$' |awk '{print $(NF-1)}' |awk -F"%" '{print $1}'` 
mail_user=root
if [ $disk_use -gt 90 ];then
		echo "`date +%F-%H` disk:${disk_use}%" |mail -s "disk warning..." $mail_user	
fi

# 内存警报脚本
#!/bin/bash
mem_used=`free -m |grep Mem |awk '{print $3}'`
mem_total=`free -m |grep Mem |awk '{print $2}'`
mem_percent=$((mem_used*100/$mem_total))
warning_file=/shell/mem_war.txt
	rm -rf $warning_file
	#if [ $mem_percent -ge 80 ];then
	if (($mem_percent>60));then
			echo "`date +%F-%H` memory:${mem_percent}%" > $warning_file
	fi

	if [ -f $warning_file ];then
			mail -s "mem warning..." root < $warning_file
			rm -rf $warning_file
	fi

Cadena de juicio

Parámetro de juicio sentido
-desde Juzga si esaireCadena, es cierto si la longitud de la cadena es 0
-norte Juzga si esno vacioCadena, la longitud de la cadena no es 0 es verdadera
cadena1 = cadena2 Determina si las cadenas son iguales
cadena1! = cadena2 Determinar si las cadenas no son iguales
[root@maomao shell]# [ $USER = 'root' ];echo $?
0
[root@maomao shell]# [ $USER = 'roo' ];echo $?
1
[root@maomao shell]# [ $USER = 'root' ];echo $?
0
[root@maomao shell]# [ $USER == 'root' ];echo $?
0
[root@maomao shell]# [[ $USER == 'root' ]];echo $?
0
[root@maomao shell]# [[ "$USER" == 'root' ]];echo $?
0

Juicio de múltiples condiciones

Símbolo de juicio sentido Por ejemplo
-a 和 && Lógico y [1 -eq 1 -a 1 -ne 0] 、 [1 -eq 1] && [1 -ne 0]
-o suma || OR lógico [1 -eq 1 -o 1 -ne 1] 、 [1 -eq 1] || [1 -ne 1]

Nota especial:

&& antes de la expresiónEs verdad, Ejecutará el siguiente código

|| La expresión anterior为假,才会执行后面的代码

; 用于分割命令或表达式

实例

  • 数值比较
[root@maomao ~]# [ $(id -u) -eq 0 ] && echo "the user is root" || echo "the user is not root"
  • 类C风格的数值比较
注意:在(( ))中,=表示赋值;==表示判断
[root@maomao ~]# ((1==2));echo $?
[root@maomao ~]# ((1<2));echo $?
[root@maomao ~]# ((2>=1));echo $?
[root@maomao ~]# ((2!=1));echo $?
[root@maomao ~]# ((`id -u`==0));echo $?
[root@maomao ~]# ((a=123));echo $a
[root@maomao ~]# unset a
[root@maomao ~]# ((a==123));echo $?
  • 字符串比较
注意:双引号引起来,看作一个整体;===[ 字符串 ] 比较中都表示判断
[root@maomao ~]# a='hello world';b=world
[root@maomao ~]# [ $a = $b ];echo $?
[root@maomao ~]# [ "$a" = "$b" ];echo $?
[root@maomao ~]# [ "$a" != "$b" ];echo $?
[root@maomao ~]# [ "$a" !== "$b" ];echo $?        错误
[root@maomao ~]# [ "$a" == "$b" ];echo $?
[root@maomao ~]# test "$a" != "$b";echo $?


test  表达式
[ 表达式 ]
[[ 表达式 ]]

思考:[ ][[ ]] 有什么区别?

[root@maomao ~]# a=
[root@maomao ~]# test -z $a;echo $?
[root@maomao ~]# a=hello
[root@maomao ~]# test -z $a;echo $?
[root@maomao ~]# test -n $a;echo $?
[root@maomao ~]# test -n "$a";echo $?

# [ '' = $a ];echo $?
-bash: [: : unary operator expected
2
# [[ '' = $a ]];echo $?
0


[root@maomao ~]# [ 1 -eq 0 -a 1 -ne 0 ];echo $?
[root@maomao ~]# [ 1 -eq 0 && 1 -ne 0 ];echo $?
[root@maomao ~]# [[ 1 -eq 0 && 1 -ne 0 ]];echo $?

脚本实例:
批量创建用户的脚本

#!/bin/bash
# 创建用户的脚本
# by stan Z
while true
do
        read -p "Please input number:" num
        if [[ ! "$num" =~ ^[0-9]+$ || "$num" =~ ^0+$ ]];then
                echo "error number!"
        else
                break
        fi  
done
while true
do
        read -p "Please input prefix:" prefix
        if [ -z "$prefix" ];then
                echo "error prefix"
        else
                break
        fi  
done
for i in `seq $num`
do
        user=$prefix$i
        useradd $user
        echo "123" |passwd --stdin $user &>/dev/null
        if [ $? -eq 0 ];then
                echo "$user is created."
        fi
done

逻辑运算符总结

  1. 符号;和&&和||都可以用来分割命令或者表达式
  2. 分号(;)完全不考虑前面的语句是否正确执行,都会执行;号后面的内容
  3. &&符号,需要考虑&&前面的语句的正确性,前面语句正确执行才会执行&&后的内容;反之亦然
  4. ||符号,需要考虑||前面的语句的非正确性,前面语句执行错误才会执行||后内容;反之亦然
  5. 如果&&和||一起出现,从左往右依次看,按照以上原则

Supongo que te gusta

Origin blog.csdn.net/Cantevenl/article/details/115263888
Recomendado
Clasificación