Compartir tecnología

[Linux][Shell][Control lógico de Shell] Explicación detallada

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


1.si juicio

1.si-entonces

  • gramática
    if command
    then
    	command
    fi
    
    • 1
    • 2
    • 3
    • 4
  • intentoifLas declaraciones son diferentes de otros lenguajes de programación, bashifLa declaración seráEjecutar directamenteifLos siguientes comandos
    • Si el comandoEjecutado correctamente (el código de estado es 0), el comando en ese momento se ejecutará
    • De lo contrario, no se ejecutará o se ejecutarán otras declaraciones lógicas y finalmentefiControl lógico final

2.si-entonces-sino

  • gramática
    if command
    then
    	command
    else
    	command
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

3.elif

  • gramática
if command
then
	command
elif command
then
	command
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.caso

  • Puede reemplazar muchosif-elserama
    case "变量" in
    值1)
     命令
     ;;
    值2)
     命令2
     ;;
    *)
     命令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

5. Ensúciate las manos de verdad

  • Monitoreo de memoria
    #!/bin/bash
    
    FreeMem=`free -m | awk 'NR==2 {print $NF}'`
    CHARS="Current memory is $FreeMem"
    
    if [ "$FreeMem" -lt 16000 ]
    then
        echo $CHARS
        echo "内存不足,抓紧维护服务器!"
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • Leer tamaño de comparación
    • Versión de rama única
      #!/bin/bash
      
      a=$1
      b=$2
      
      if [ $a -lt $b ]
      then
          echo "Yes, $a less than $b"
          exit 0
      fi
      
      if [ $a -eq $b ]
      then
          echo "Yes, $a equal $b"
          exit 0
      fi
      
      if [ $a -gt $b ]
      then
          echo "Yes, $a greater than $b"
          exit 0
      fi
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
    • versión multirama
      #!/bin/bash
      
      a=$1
      b=$2
      
      if [ $a -lt $b ]
      then
          echo "Yes, $a less than $b"
          exit 0
      elif [ $a -eq $b ]
      then
          echo "Yes, $a equal $b"
          exit 0
      else [ $a -gt $b ]
          echo "Yes, $a greater than $b"
          exit 0
      fi
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
  • Script de monitoreo MySQL
    #!/bin/bash
    
    if [ `netstat -tunlp | grep mysql | wc -l` -ge "1" ]
    then
        echo "MySQL is running"
    else
        echo "MySQL is stopped"
        # systemctl start mysql.service
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • Script de inicio de Rsync
    #!/bin/bash
    
    if [ "$#" -ne 1 ]
    then
        echo "Usage: $0 {start|stop|restart}"
        exit 1
    fi
    
    if [ "$1" = "start" ]
    then
        /usr/bin/rsync --daemon
        sleep 2
    
        if [ `netstat -tunlp | grep rsync | wc -l` -ge 1 ]
        then
            echo "Rsync is started"
            exit 0
        fi
    elif [ "$1" = "stop" ]
    then
        killall rsync &>/dev/null
        sleep 2
    
        if [ `netstat -tunlp | grep rsync | wc -l` -eq 0 ]
        then
            echo "Rsync is stopped"
            exit 0
        fi
    elif [ "$1" = "restart" ]
    then
        kill rsync
        sleep 1
    
        killpro=`netstat -tunlp | grep rsync | wc -l`
        /usr/bin/rsync --daemon
        sleep 1
    
        startpro=`netstat -tunlp | grep rsync | wc -l`
    
        if [ "$killpro" -eq 0 -a "$startpro" -ge 1 ]
        then
            echo "Rsync is restarted"
            exit 0
        fi
    else
        echo "Usage: $0 {start|stop|restart}"
        exit 1
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

2.Pruebas condicionales

0.Explicación por adelantado

  • Sintaxis comúnmente utilizada para pruebas condicionales
    Por favor agregue la descripción de la imagen.

  • Operadores de prueba de cadenas de uso común
    Por favor agregue la descripción de la imagen.

  • comparación numérica
    Por favor agregue la descripción de la imagen.

  • Operadores logicos
    Por favor agregue la descripción de la imagen.

  • Tabla comparativa de cada comando
    Por favor agregue la descripción de la imagen.


1.comando de prueba

  • testLa definición más corta de un comando podría serEvaluar una expresión
    • Si la condición es verdadera, se devuelve un valor de 0.
    • Si la expresión no es verdadera, se devuelve un valor mayor que 0, que también puede denominarse valor falso.
    • La forma más sencilla de comprobar el estado del último comando ejecutado es utilizar$?valor
  • parámetro
    • Acerca de un nombre de archivodetección de tipo(existen o no), tales como:test -e filename

      parámetrosignificado
      -e¿Existe el nombre del archivo?
      -f¿El nombre del archivo es un archivo (file)
      -dSi el nombre del archivo es un directorio (directory)
      -bes el nombre del archivoblock devicedispositivo
      -c¿El nombre del archivo es uncharacter devicedispositivo
      -S¿El nombre del archivo es unSocketdocumento
      -pSi el nombre del archivo es un archivo FIFO (pila)
      -LSi el nombre del archivo es un archivo de conexión
    • sobre archivosDetección de permisos,como:test -r filename

      parámetrosignificado
      -r¿El nombre del archivo tienelegiblepropiedades
      -w¿El nombre del archivo tienegrabablepropiedades
      -x¿El nombre del archivo tieneEjecutablepropiedades
      -u¿El nombre del archivo tieneSuicidiopropiedades
      -g¿El nombre del archivo tieneSGIDpropiedades
      -k¿El nombre del archivo tieneUn poco pegajosopropiedades
      -ses el nombre del archivoarchivo que no está en blanco
    • acerca deComparación entre dos archivos,como:test file1 -nt file2

      parámetrosignificado
      -nt(más nuevo que), juezfile1¿Es mejor quefile2nuevo
      -ot(mayor que), juezfile1¿Es mejor quefile2viejo
      -efjuezfile1yfile2Si es el mismo archivo, se puede utilizar enenlace duroen el juicio de
      El significado principal es determinar si los dos archivos apuntan al mismoinode
    • acerca deDeterminar entre dos números enteros,como:test num1 -eq num2

      parámetrosignificado
      -eqdos numeros son iguales
      -neDos números no son iguales
      -gtnum1más que elnum2
      -ltnum1menos quenum2
      -genum1mayor o igual anum2
      -lenum1Menos que o igual anum2
    • determinacióndatos de cadena

      parámetrosignificado
      -zSi es una cadena vacía, devuelvetrue
      -nSi no es una cadena vacía, entoncestrue
      =str1 == str2, luego regresartrue
      !=str1 != str2, luego regresartrue
    • Juicio condicional múltiple,como:test -r filename -a -x filename

      parámetrosignificado
      -a(y) Ambas situaciones se establecen al mismo tiempo
      -o(o) cualquiera de las dos situaciones es cierta
      !negación lógica

2.[]

  • Las pruebas condicionales a menudo se realizan en scripts y los más utilizados son los corchetes.[]
  • testy[]El efecto es el mismo
  • Elementos basicos
    • []Dos símbolos deben estar separados por espacios a la izquierda y a la derecha.
    • Debe haber un espacio entre el operador interno y la variable operativa, como por ejemplo:[ "a" = "b" ]
    • Durante la comparación de cadenas,> <Necesita escribirse como> /<escapar
    • []hilo mediano o${}Utilice variables tanto como sea posible.""Entre comillas dobles para evitar referencias indefinidas a valores
      [ -n "$filename" ]
      
      • 1
    • []Se puede utilizar en-a -oRealizar operaciones lógicas, no admitidas.&& ||
    • []es un comando integrado de bash

3.Soportes dobles

1.(())

2.[[]]

  • Los soportes dobles proporcionanFunciones avanzadas para cadenas, coincidencia de patrones y expresión regular
  • Elementos basicos
    • [[]]Dos símbolos deben estar separados por espacios a la izquierda y a la derecha.
    • Debe haber un espacio entre el operador interno y la variable operativa, como por ejemplo:[[ "a" = "b" ]]
    • En comparación de cadenas, puedes usarlo directamente.> <, no hay necesidad de escapar
    • [[]]hilo mediano o${}Utilice variables tanto como sea posible.""encerrado entre comillas dobles
      • Si no se usa""Si se incluye entre comillas dobles, se realizará la coincidencia de patrones y metacaracteres.
    • [[]]Se puede utilizar internamente&& ||Realizar operaciones lógicas
    • [[]]Es la palabra clave de bash.
    • [[]]Otros usos son los mismos que[]Mismo

4. Ensúciate las manos de verdad

  • Probar el juicio lógico
    #!/bin/bash
    
    read -p "Pls input a char:> " var1
    
    [ "${var1}" -eq 1 ] && {
        echo ${var1}
        exit 0
    }
    
    [ "$var1" -eq 2 ] && {
        echo $var1
        exit 0
    }
    
    [ "$var1" -ne "1" -a "$var1" -ne "2" ] && {
        echo "Script Error"
        exit 1
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • Script de instalación simulado
    #!/bin/bash
    
    path=/scripts
    
    [ ! -d "$path" ] && mkdir -p scripts
    
    cat << END
    	1.[install lamp]
    	2.[install inmp]
    	3.[exit]
    END
    
    read -p "Pls input your choice:> " num
    
    # 判断输入是否合法
    [[ ! $num =~ [1-3] ]] && {
    	echo "The num you input must be in {1|2|3}"
    	echo "Input Error"
    	exit 1
    }
    
    [ $num -eq 1 ] && {
    	echo "start installing lamp...waiting..."
    	sleep 2
    
    	# 如果该脚本没权限
    	[ ! -x "$path/lamp.sh" ] || {
    		echo "The file does not exit or can't be exec"
    		exit 2
    	}
    
    	# 安装脚本
    	source ${path}/lamp.sh
    	exit $?
    }
    
    [ $num -eq 2 ] && {
    	echo "start installing lnmp...waiting..."
    	sleep 2
    	[ ! -x "$path/lnmp.sh" ] || {
    		echo "The file does not exit or can't be exec"
    		exit 3
    	}
    	source ${path}/lnmp.sh
    	exit $?
    }
    
    [ $num -eq 3 ] && {
    	echo "Bye~"
    	exit 4
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

3. Bucle

1.para

  • gramática
    for var in list
    do
    	commands
    done
    
    • 1
    • 2
    • 3
    • 4
  • Admite estilo de lenguaje C
    for (( i=1;i<=10;i++ ))
    do
    	echo "The next number is $i"
    done
    
    • 1
    • 2
    • 3
    • 4

2.mientras

  • gramática: aquítest commandyif-elseEl formato de la declaración es el mismo y puedes usar cualquier comando bash.

    • Avisowhiledetest commandEl código de estado de salida debe cambiar con el comando en el bucle. De lo contrario, si el código de estado no cambia, el bucle continuará continuamente.
      while test command
      do
      	commands
      done
      
      • 1
      • 2
      • 3
      • 4
  • whileOrdenSe pueden escribir múltiples comandos de prueba.

    • soloEl código de estado de salida del último comando de prueba se utilizará para determinar si se debe salir del bucle.
    • Presta atención a los saltos de línea., varios comandos de prueba deberían aparecer individualmente en cada línea
      var1=10
      while echo $var1
      	[ $var1 -ge 0 ]
      do
      	echo "This is inside the loop"
      	var1=$[ $var1 -1 ]
      done
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

3.hasta el comando

  • untilywhilesignificado opuestountilEl comando requiere que especifique unComandos de prueba que devuelven códigos de salida distintos de cero
    • Solo si el código de estado de salida no es 0, bash ejecutará el comando de bucle
  • gramática
    until test commands
    do
    	other commands
    done
    
    • 1
    • 2
    • 3
    • 4
  • untiltambiénAdmite múltiples comandos de prueba, solo el último determina si bash ejecuta otros comandos
    until echo $var1
    	[ $var1 -eq 0 ]
    do
    	echo "Inside the loop:$var1"
    	var1=$[ $var1 - 25 ]
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

4. Bucle de control

1.romper

  • efecto:Forzar la salida de cualquier tipo de bucle.
    • Al saltar de múltiples bucles,breakTerminará automáticamente el bucle con mayor cantidad de memoria en el que se encuentre.
  • Terminar el bucle exteriornIndica el nivel de bucle del que saltar. El valor predeterminado es 1 y el siguiente nivel es 2.
    break n
    
    • 1

2.continuar

  • efecto: Omita un bucle determinado y vaya directamente a la parte de juicio de este bucle.

5. Procese la salida del bucle.

  • En el script de shell, el resultado después de la salida del bucle puede serRedirección de salida
    for (( a = 1;a<10;a++ ))
    do
    	echo "The number is $a"
    done > test.txt
    echo "Finished"
    
    • 1
    • 2
    • 3
    • 4
    • 5