Technologieaustausch

[Linux][Shell][Shell Logic Control] Detaillierte Erklärung

2024-07-12

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


1. wenn Urteil

1.wenn-dann

  • Grammatik
    if command
    then
    	command
    fi
    
    • 1
    • 2
    • 3
    • 4
  • bashifAnweisungen unterscheiden sich von anderen Programmiersprachen, BashifErklärung wirdDirekt ausführenifDie folgenden Befehle
    • Wenn der BefehlKorrekt ausgeführt (Statuscode ist 0), der Befehl wird dann ausgeführt
    • Andernfalls wird es nicht ausgeführt oder andere logische Anweisungen werden schließlich ausgeführtfiLogiksteuerung beenden

2.wenn-dann-sonst

  • Grammatik
    if command
    then
    	command
    else
    	command
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

3.elif

  • Grammatik
if command
then
	command
elif command
then
	command
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.Fall

  • Kann viele ersetzenif-elseZweig
    case "变量" in
    值1)
     命令
     ;;
    值2)
     命令2
     ;;
    *)
     命令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

5. Machen Sie sich tatsächlich die Hände schmutzig

  • Speicherüberwachung
    #!/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
  • Vergleichsgröße lesen
    • Einzelzweigversion
      #!/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
    • Mehrzweigversion
      #!/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
  • MySQL-Überwachungsskript
    #!/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
  • Rsync-Startskript
    #!/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.Bedingte Prüfung

0.Erläuterung im Voraus

  • Häufig verwendete Syntax für bedingte Tests
    Bitte fügen Sie eine Bildbeschreibung hinzu

  • Häufig verwendete String-Testoperatoren
    Bitte fügen Sie eine Bildbeschreibung hinzu

  • Zahlenvergleich
    Bitte fügen Sie eine Bildbeschreibung hinzu

  • Logische Operatoren
    Bitte fügen Sie eine Bildbeschreibung hinzu

  • Vergleichstabelle jedes Befehls
    Bitte fügen Sie eine Bildbeschreibung hinzu


1.Testbefehl

  • testDie kürzeste Definition eines Befehls könnte seinBewerten Sie einen Ausdruck
    • Wenn die Bedingung erfüllt ist, wird der Wert 0 zurückgegeben
    • Wenn der Ausdruck nicht wahr ist, wird ein Wert größer 0 zurückgegeben – was auch als falscher Wert bezeichnet werden kann
    • Der einfachste Weg, den Status des zuletzt ausgeführten Befehls zu überprüfen, ist die Verwendung von$?Wert
  • Parameter
    • Über einen DateinamenTyperkennung(existieren oder nicht), wie zum Beispiel:test -e filename

      ParameterBedeutung
      -eExistiert der Dateiname?
      -fIst der Dateiname eine Datei (file)
      -dOb der Dateiname ein Verzeichnis ist (directory)
      -bIst der Dateinameblock deviceGerät
      -cIst der Dateiname acharacter deviceGerät
      -SIst der Dateiname aSocketdokumentieren
      -pOb es sich bei dem Dateinamen um eine FIFO-Datei (Stapeldatei) handelt
      -LOb es sich bei dem Dateinamen um eine Verbindungsdatei handelt
    • über DateienBerechtigungserkennung,wie:test -r filename

      ParameterBedeutung
      -rHat der DateinamelesbarEigenschaften
      -wHat der DateinameschreibbarEigenschaften
      -xHat der DateinameAusführbarEigenschaften
      -uHat der DateinameSUIDEigenschaften
      -gHat der DateinameSGIDEigenschaften
      -kHat der DateinameKlebriges StückEigenschaften
      -sIst der Dateinamenicht leere Datei
    • umVergleich zwischen zwei Dateien,wie:test file1 -nt file2

      ParameterBedeutung
      -nt(neuer als), Richterfile1Ist es besser alsfile2neu
      -ot(älter als), Richterfile1Ist es besser alsfile2alt
      -efRichterfile1Undfile2Unabhängig davon, ob es sich um dieselbe Datei handelt, kann sie verwendet werdenHarter Linkauf das Urteil von
      Die Hauptbedeutung besteht darin, festzustellen, ob die beiden Dateien auf dasselbe verweiseninode
    • umBestimmung zwischen zwei ganzen Zahlen,wie:test num1 -eq num2

      ParameterBedeutung
      -eqZwei Zahlen sind gleich
      -neZwei Zahlen sind nicht gleich
      -gtnum1mehr als dienum2
      -ltnum1weniger alsnum2
      -genum1größer oder gleichnum2
      -lenum1Gleich oder kleiner alsnum2
    • BestimmungString-Daten

      ParameterBedeutung
      -zWenn es sich um eine leere Zeichenfolge handelt, kehren Sie zurücktrue
      -nWenn es sich nicht um eine leere Zeichenfolge handelt, danntrue
      =str1 == str2, dann zurücktrue
      !=str1 != str2, dann zurücktrue
    • Mehrfaches bedingtes Urteil,wie:test -r filename -a -x filename

      ParameterBedeutung
      -a(und) Beide Situationen werden gleichzeitig hergestellt
      -o(oder) eine der beiden Situationen ist wahr
      !logische Verneinung

2.[]

  • Bedingungstests werden häufig in Skripten durchgeführt und am häufigsten werden eckige Klammern verwendet.[]
  • testUnd[]Der Effekt ist der gleiche
  • Grundelemente
    • []Zwei Symbole müssen links und rechts durch Leerzeichen getrennt werden
    • Zwischen dem internen Operator und der Betriebsvariablen muss ein Leerzeichen stehen, z. B.:[ "a" = "b" ]
    • Beim String-Vergleich> <Muss geschrieben werden als> /<Flucht
    • []mittlere Saite bzw${}Verwenden Sie so oft wie möglich Variablen""In doppelte Anführungszeichen gesetzt, um undefinierte Verweise auf Werte zu vermeiden
      [ -n "$filename" ]
      
      • 1
    • []Kann verwendet werden-a -oLogische Operationen ausführen, nicht unterstützt&& ||
    • []ist ein integrierter Bash-Befehl

3.Doppelte Klammern

1.(())

2.[[]]

  • Doppelte Klammern sorgenErweiterte Funktionen für Zeichenfolgen, Mustervergleich und Vergleich mit regulären Ausdrücken
  • Grundelemente
    • [[]]Zwei Symbole müssen links und rechts durch Leerzeichen getrennt werden
    • Zwischen dem internen Operator und der Betriebsvariablen muss ein Leerzeichen stehen, z. B.:[[ "a" = "b" ]]
    • Im String-Vergleich können Sie es direkt verwenden> <, kein Grund zur Flucht
    • [[]]mittlere Saite bzw${}Verwenden Sie so oft wie möglich Variablen""in doppelte Anführungszeichen eingeschlossen
      • Bei Nichtgebrauch""Wenn es in doppelte Anführungszeichen gesetzt wird, wird ein Muster- und Metazeichenabgleich durchgeführt.
    • [[]]Kann innerlich verwendet werden&& ||Führen Sie logische Operationen durch
    • [[]]Es ist das Schlüsselwort von Bash
    • [[]]Andere Verwendungen sind die gleichen wie[]Dasselbe

4. Machen Sie sich tatsächlich die Hände schmutzig

  • Testen Sie das logische Urteilsvermögen
    #!/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
  • Simuliertes Installationsskript
    #!/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. Schleife

1.für

  • Grammatik
    for var in list
    do
    	commands
    done
    
    • 1
    • 2
    • 3
    • 4
  • Unterstützt den C-Sprachstil
    for (( i=1;i<=10;i++ ))
    do
    	echo "The next number is $i"
    done
    
    • 1
    • 2
    • 3
    • 4

2.während

  • Grammatik: Hiertest commandUndif-elseDas Anweisungsformat ist dasselbe und Sie können jeden Bash-Befehl verwenden

    • Beachtenwhilevontest commandDer Exit-Statuscode muss sich mit dem Befehl in der Schleife ändern. Andernfalls wird die Schleife kontinuierlich fortgesetzt, wenn sich der Statuscode nicht ändert.
      while test command
      do
      	commands
      done
      
      • 1
      • 2
      • 3
      • 4
  • whileBefehlEs können mehrere Testbefehle geschrieben werden

    • nurDer Exit-Statuscode des letzten Testbefehls wird verwendet, um zu bestimmen, ob die Schleife verlassen werden soll.
    • Achten Sie auf Zeilenumbrüche, sollten mehrere Testbefehle einzeln in jeder Zeile erscheinen
      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.bis Befehl

  • untilUndwhileJaentgegengesetzte BedeutunguntilFür den Befehl müssen Sie a angebenTestbefehle, die Exit-Codes ungleich Null zurückgeben
    • Nur wenn der Exit-Statuscode nicht 0 ist, führt Bash den Schleifenbefehl aus
  • Grammatik
    until test commands
    do
    	other commands
    done
    
    • 1
    • 2
    • 3
    • 4
  • untilAuchUnterstützt mehrere Testbefehle, nur der letzte bestimmt, ob Bash andere Befehle ausführt
    until echo $var1
    	[ $var1 -eq 0 ]
    do
    	echo "Inside the loop:$var1"
    	var1=$[ $var1 - 25 ]
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

4. Regelkreis

1. Pause

  • Wirkung:Erzwingt das Beenden jeder Art von Schleife
    • Beim Springen aus mehreren SchleifenbreakBeendet automatisch die meiste Speicherschleife, in der es sich befindet
  • Äußere Schleife beendennGibt die Schleifenebene an, aus der herausgesprungen werden soll. Der Standardwert ist 1 und die nächste Ebene ist 2.
    break n
    
    • 1

2.weiter

  • Wirkung: Überspringen Sie eine bestimmte Schleife und gehen Sie direkt zum Beurteilungsteil dieser Schleife.

5. Verarbeiten Sie die Ausgabe der Schleife

  • Im Shell-Skript kann das Ergebnis nach der Schleife ausgegeben werdenAusgabeumleitung
    for (( a = 1;a<10;a++ ))
    do
    	echo "The number is $a"
    done > test.txt
    echo "Finished"
    
    • 1
    • 2
    • 3
    • 4
    • 5