Condivisione della tecnologia

[Linux] [Shell] [Controllo logico della shell] Spiegazione dettagliata

2024-07-12

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


1.se giudizio

1.se-allora

  • grammatica
    if command
    then
    	command
    fi
    
    • 1
    • 2
    • 3
    • 4
  • bashifLe istruzioni sono diverse da altri linguaggi di programmazione, bashifLa dichiarazione saràCorri direttamenteifI seguenti comandi
    • Se il comandoEseguito correttamente (il codice di stato è 0), il comando in seguito verrà eseguito
    • Altrimenti non verrà eseguito oppure verranno eseguite altre istruzioni logiche e infinefiTerminare il controllo logico

2.se-allora-altrimenti

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

3. elif

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

4.caso

  • Può sostituirne moltiif-elseramo
    case "变量" in
    值1)
     命令
     ;;
    值2)
     命令2
     ;;
    *)
     命令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

5. Sporcati davvero le mani

  • Monitoraggio della 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
  • Leggi le dimensioni di confronto
    • Versione a ramo singolo
      #!/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
    • versione multi-ramo
      #!/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 di monitoraggio 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 di avvio di 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.Test condizionale

0.Spiegazione in anticipo

  • Sintassi comunemente utilizzata per i test condizionali
    Aggiungi la descrizione dell'immagine

  • Operatori di test di stringa comunemente utilizzati
    Aggiungi la descrizione dell'immagine

  • confronto numerico
    Aggiungi la descrizione dell'immagine

  • Operatori logici
    Aggiungi la descrizione dell'immagine

  • Tabella comparativa di ogni comando
    Aggiungi la descrizione dell'immagine


1.comando di prova

  • testLa definizione più breve di comando potrebbe essereValutare un'espressione
    • Se la condizione è vera, viene restituito il valore 0
    • Se l'espressione non è vera, viene restituito un valore maggiore di 0, che può anche essere chiamato valore falso
    • Il modo più semplice per verificare lo stato dell'ultimo comando eseguito è utilizzare$?valore
  • parametro
    • Informazioni sul nome di un filerilevamento del tipo(esiste o no), come ad esempio:test -e filename

      parametrosignificato
      -eIl nome del file esiste?
      -fIl nome del file è un file (file)
      -dSe il nome del file è una directory (directory)
      -bNome del fileblock devicedispositivo
      -cIl nome del file è acharacter devicedispositivo
      -SIl nome del file è aSocketdocumento
      -pIndica se il nome del file è un file FIFO (pila).
      -LSe il nome del file è un file di connessione
    • sui fileRilevamento dei permessi,Piace:test -r filename

      parametrosignificato
      -rIl nome del file haleggibileproprietà
      -wIl nome del file hascrivibileproprietà
      -xIl nome del file haEseguibileproprietà
      -uIl nome del file haSUIDproprietà
      -gIl nome del file haSGIDproprietà
      -kIl nome del file haUn po' appiccicosoproprietà
      -sNome del filefile non vuoto
    • DiConfronto tra due file,Piace:test file1 -nt file2

      parametrosignificato
      -nt(più recente di), giudicefile1È meglio difile2nuovo
      -ot(più vecchio di), giudicefile1È meglio difile2vecchio
      -efgiudicefile1Efile2Se si tratta dello stesso file, può essere utilizzato incollegamento difficilesulla sentenza di
      Il significato principale è determinare se i due file puntano allo stessoinode
    • DiDeterminazione tra due numeri interi,Piace:test num1 -eq num2

      parametrosignificato
      -eqDue numeri sono uguali
      -neDue numeri non sono uguali
      -gtnum1più delnum2
      -ltnum1meno dinum2
      -genum1maggiore o uguale anum2
      -lenum1minore o uguale anum2
    • determinazionedati di stringa

      parametrosignificato
      -zSe è una stringa vuota, ritornatrue
      -nSe non è una stringa vuota, alloratrue
      =str1 == str2, quindi tornaretrue
      !=str1 != str2, quindi tornaretrue
    • Giudizio condizionale multiplo,Piace:test -r filename -a -x filename

      parametrosignificato
      -a(e) Entrambe le situazioni vengono stabilite contemporaneamente
      -o(o) una delle due situazioni è vera
      !negazione logica

2.[]

  • I test condizionali vengono spesso eseguiti negli script e quelli più comunemente utilizzati sono le parentesi quadre.[]
  • testE[]L'effetto è lo stesso
  • Elementi basici
    • []Due simboli devono essere separati da spazi a sinistra e a destra
    • Deve esserci uno spazio tra l'operatore interno e la variabile operativa, come ad esempio:[ "a" = "b" ]
    • Durante il confronto tra stringhe,> <È necessario scrivere come> /<fuga
    • []corda media o${}Usa le variabili il più possibile""Racchiuso tra virgolette doppie per evitare riferimenti non definiti a valori
      [ -n "$filename" ]
      
      • 1
    • []Può essere utilizzato in-a -oEsegui operazioni logiche, non supportate&& ||
    • []è un comando integrato in bash

3.Doppie parentesi

1.(())

2.[[]]

  • Forniscono doppie parentesiFunzionalità avanzate per stringhe, corrispondenza di modelli e corrispondenza di espressioni regolari
  • Elementi basici
    • [[]]Due simboli devono essere separati da spazi a sinistra e a destra
    • Deve esserci uno spazio tra l'operatore interno e la variabile operativa, come ad esempio:[[ "a" = "b" ]]
    • Nel confronto tra stringhe, puoi usarlo direttamente> <, non c'è bisogno di scappare
    • [[]]corda media o${}Usa le variabili il più possibile""racchiuso tra virgolette doppie
      • Se non utilizzato""Se racchiuso tra virgolette doppie, verrà eseguita la corrispondenza di pattern e metacaratteri.
    • [[]]Può essere utilizzato internamente&& ||Eseguire operazioni logiche
    • [[]]È la parola chiave di bash
    • [[]]Altri usi sono gli stessi di[]Stesso

4. Sporcati davvero le mani

  • Metti alla prova il giudizio logico
    #!/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 di installazione simulato
    #!/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. Ciclo

1.per

  • grammatica
    for var in list
    do
    	commands
    done
    
    • 1
    • 2
    • 3
    • 4
  • Supporta lo stile del linguaggio C
    for (( i=1;i<=10;i++ ))
    do
    	echo "The next number is $i"
    done
    
    • 1
    • 2
    • 3
    • 4

2.mentre

  • grammatica: Quitest commandEif-elseIl formato dell'istruzione è lo stesso e puoi utilizzare qualsiasi comando bash

    • AvvisowhileDitest commandIl codice dello stato di uscita deve cambiare con il comando nel ciclo Altrimenti, se il codice dello stato non cambia, il ciclo continuerà continuamente.
      while test command
      do
      	commands
      done
      
      • 1
      • 2
      • 3
      • 4
  • whileOrdineÈ possibile scrivere più comandi di test

    • soltantoIl codice dello stato di uscita dell'ultimo comando di test verrà utilizzato per determinare se uscire dal ciclo.
    • Prestare attenzione alle interruzioni di riga, più comandi di test dovrebbero apparire individualmente su ciascuna riga
      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.fino al comando

  • untilEwhilesignificato oppostountilIl comando richiede di specificare aTestare i comandi che restituiscono codici di uscita diversi da zero
    • Solo se il codice dello stato di uscita non è 0, bash eseguirà il comando loop
  • grammatica
    until test commands
    do
    	other commands
    done
    
    • 1
    • 2
    • 3
    • 4
  • untilAncheSupporta più comandi di test, solo l'ultimo determina se bash esegue altri comandi
    until echo $var1
    	[ $var1 -eq 0 ]
    do
    	echo "Inside the loop:$var1"
    	var1=$[ $var1 - 25 ]
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

4. Circuito di controllo

1.rompere

  • effetto:Forza l'uscita da qualsiasi tipo di loop
    • Quando si salta fuori da più loop,breakTerminerà automaticamente la maggior parte del loop di memoria in cui si trova
  • Termina il ciclo esternonIndica il livello del loop da cui uscire. Il valore predefinito è 1 e il livello successivo è 2.
    break n
    
    • 1

2.continua

  • effetto: salta un certo ciclo e vai direttamente alla parte di giudizio di questo ciclo.

5. Elaborare l'output del ciclo

  • Nello script di shell, il risultato dopo l'output del ciclo può essereReindirizzamento dell'output
    for (( a = 1;a<10;a++ ))
    do
    	echo "The number is $a"
    done > test.txt
    echo "Finished"
    
    • 1
    • 2
    • 3
    • 4
    • 5