Κοινή χρήση τεχνολογίας

[Linux][Shell][Shell Logic Control] Λεπτομερής εξήγηση

2024-07-12

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


1.αν κρίση

1.αν-τότε

  • γραμματική
    if command
    then
    	command
    fi
    
    • 1
    • 2
    • 3
    • 4
  • βίαιο χτύπημαifΟι δηλώσεις είναι διαφορετικές από άλλες γλώσσες προγραμματισμού, τις bashifΔήλωση θαΕκτελέστε απευθείαςifΟι παρακάτω εντολές
    • Αν η εντολήΕκτελέστηκε σωστά (ο κωδικός κατάστασης είναι 0), η εντολή στο τότε θα εκτελεστεί
    • Διαφορετικά, δεν θα εκτελεστεί ή θα εκτελεστούν άλλες λογικές δηλώσεις και τέλοςfiΤέλος λογικού ελέγχου

2.αν-τότε-άλλο

  • γραμματική
    if command
    then
    	command
    else
    	command
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

3.elif

  • γραμματική
if command
then
	command
elif command
then
	command
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.περίπτωση

  • Μπορεί να αντικαταστήσει πολλάif-elseκλαδί
    case "变量" in
    值1)
     命令
     ;;
    值2)
     命令2
     ;;
    *)
     命令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

5. Στην πραγματικότητα, λερώστε τα χέρια σας

  • Παρακολούθηση μνήμης
    #!/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
  • Διαβάστε το μέγεθος σύγκρισης
    • Έκδοση ενός κλάδου
      #!/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
    • πολυκλαδική έκδοση
      #!/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
    #!/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
    #!/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.Δοκιμή υπό όρους

0.Εξήγηση εκ των προτέρων

  • Συντακτικό που χρησιμοποιείται συνήθως για δοκιμές υπό όρους
    Προσθέστε περιγραφή εικόνας

  • Συχνά χρησιμοποιούμενοι τελεστές δοκιμής συμβολοσειρών
    Προσθέστε περιγραφή εικόνας

  • αριθμητική σύγκριση
    Προσθέστε περιγραφή εικόνας

  • Λογικοί τελεστές
    Προσθέστε περιγραφή εικόνας

  • Συγκριτικός πίνακας κάθε εντολής
    Προσθέστε περιγραφή εικόνας


1.εντολή δοκιμής

  • testΟ συντομότερος ορισμός μιας εντολής μπορεί να είναιΑξιολογήστε μια έκφραση
    • Εάν η συνθήκη είναι αληθής, επιστρέφεται μια τιμή 0
    • Εάν η έκφραση δεν είναι αληθής, επιστρέφεται μια τιμή μεγαλύτερη από 0 - η οποία μπορεί επίσης να ονομαστεί ψευδής τιμή
    • Ο ευκολότερος τρόπος για να ελέγξετε την κατάσταση της τελευταίας εντολής που εκτελέστηκε είναι να χρησιμοποιήσετε$?αξία
  • παράμετρος
    • Σχετικά με ένα όνομα αρχείουανίχνευση τύπου(υπάρχουν ή όχι), όπως:test -e filename

      παράμετροςσημασία
      -eΥπάρχει το όνομα αρχείου;
      -fΕίναι το όνομα αρχείου αρχείο (file)
      -dΕάν το όνομα αρχείου είναι κατάλογος (directory)
      -bΕίναι το όνομα του αρχείουblock deviceσυσκευή
      -cΕίναι το όνομα αρχείου acharacter deviceσυσκευή
      -SΕίναι το όνομα αρχείου aSocketέγγραφο
      -pΕάν το όνομα του αρχείου είναι αρχείο FIFO (σωρό).
      -LΕάν το όνομα αρχείου είναι αρχείο σύνδεσης
    • σχετικά με τα αρχείαΑνίχνευση άδειας,αρέσει:test -r filename

      παράμετροςσημασία
      -rΈχει το όνομα του αρχείουαναγνώσιμοςιδιότητες
      -wΈχει το όνομα του αρχείουεγγράψιμοιδιότητες
      -xΈχει το όνομα του αρχείουΕκτελέσιμαιδιότητες
      -uΈχει το όνομα του αρχείουSUIDιδιότητες
      -gΈχει το όνομα του αρχείουSGIDιδιότητες
      -kΈχει το όνομα του αρχείουΚολλώδες κομμάτιιδιότητες
      -sΕίναι το όνομα του αρχείουμη κενό αρχείο
    • σχετικά μεΣύγκριση μεταξύ δύο αρχείων,αρέσει:test file1 -nt file2

      παράμετροςσημασία
      -nt(νεότερο από), κρίνωfile1Είναι καλύτερο απόfile2νέος
      -ot(παλιότερος από), κρίνωfile1Είναι καλύτερο απόfile2παλαιός
      -efδικαστήςfile1καιfile2Είτε πρόκειται για το ίδιο αρχείο, μπορεί να χρησιμοποιηθεί σεσκληρός σύνδεσμοςκατά την κρίση του
      Η κύρια σημασία είναι να καθοριστεί εάν τα δύο αρχεία δείχνουν το ίδιοinode
    • σχετικά μεΠροσδιορισμός μεταξύ δύο ακεραίων,αρέσει:test num1 -eq num2

      παράμετροςσημασία
      -eqΔύο αριθμοί είναι ίσοι
      -neΔύο αριθμοί δεν είναι ίσοι
      -gtnum1περισσότερο από τοnum2
      -ltnum1λιγότερο απόnum2
      -genum1μεγαλύτερο ή ίσο μεnum2
      -lenum1μικρότερο ή ίσο μεnum2
    • προσδιορισμόςδεδομένα συμβολοσειράς

      παράμετροςσημασία
      -zΕάν είναι κενή συμβολοσειρά, επιστρέψτεtrue
      -nΑν δεν είναι κενή συμβολοσειρά, τότεtrue
      =str1 == str2, μετά επιστρέψτεtrue
      !=str1 != str2, μετά επιστρέψτεtrue
    • Πολλαπλή υπό όρους κρίση,αρέσει:test -r filename -a -x filename

      παράμετροςσημασία
      -a(και) Και οι δύο καταστάσεις καθορίζονται ταυτόχρονα
      -o(ή) οποιαδήποτε από τις δύο καταστάσεις είναι αληθής
      !λογική άρνηση

2.[]

  • Οι δοκιμές υπό όρους εκτελούνται συχνά σε σενάρια και οι πιο συχνά χρησιμοποιούμενες είναι οι αγκύλες.[]
  • testκαι[]Το αποτέλεσμα είναι το ίδιο
  • Βασικά στοιχεία
    • []Δύο σύμβολα πρέπει να χωρίζονται με κενά αριστερά και δεξιά
    • Πρέπει να υπάρχει ένα κενό μεταξύ του εσωτερικού χειριστή και της μεταβλητής λειτουργίας, όπως:[ "a" = "b" ]
    • Κατά τη σύγκριση χορδών,> <Πρέπει να γραφτεί ως> /<διαφυγή
    • []μεσαία χορδή ή${}Χρησιμοποιήστε μεταβλητές όσο το δυνατόν περισσότερο""Περικλείεται σε διπλά εισαγωγικά για αποφυγή απροσδιόριστων παραπομπών σε τιμές
      [ -n "$filename" ]
      
      • 1
    • []Μπορεί να χρησιμοποιηθεί σε-a -oΕκτελέστε λογικές πράξεις, που δεν υποστηρίζονται&& ||
    • []είναι μια ενσωματωμένη εντολή bash

3.Διπλοί βραχίονες

1.(())

2.[[]]

  • Διπλοί βραχίονες παρέχουνΠροηγμένες δυνατότητες για συμβολοσειρές, αντιστοίχιση μοτίβων και αντιστοίχιση κανονικών εκφράσεων
  • Βασικά στοιχεία
    • [[]]Δύο σύμβολα πρέπει να χωρίζονται με κενά αριστερά και δεξιά
    • Πρέπει να υπάρχει ένα κενό μεταξύ του εσωτερικού χειριστή και της μεταβλητής λειτουργίας, όπως:[[ "a" = "b" ]]
    • Στη σύγκριση συμβολοσειρών, μπορείτε να το χρησιμοποιήσετε απευθείας> <, δεν χρειάζεται να ξεφύγεις
    • [[]]μεσαία χορδή ή${}Χρησιμοποιήστε μεταβλητές όσο το δυνατόν περισσότερο""περικλείεται σε διπλά εισαγωγικά
      • Εάν δεν χρησιμοποιείται""Εάν περικλείεται σε διπλά εισαγωγικά, θα γίνει αντιστοίχιση μοτίβου και μεταχαρακτήρα.
    • [[]]Μπορεί να χρησιμοποιηθεί εσωτερικά&& ||Εκτελέστε λογικές πράξεις
    • [[]]Είναι η λέξη κλειδί του bash
    • [[]]Άλλες χρήσεις είναι οι ίδιες με[]Ιδιο

4. Στην πραγματικότητα, λερώστε τα χέρια σας

  • Δοκιμάστε τη λογική κρίση
    #!/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
  • Σενάριο προσομοίωσης εγκατάστασης
    #!/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. Βρόχος

1.για

  • γραμματική
    for var in list
    do
    	commands
    done
    
    • 1
    • 2
    • 3
    • 4
  • Υποστήριξη στυλ γλώσσας C
    for (( i=1;i<=10;i++ ))
    do
    	echo "The next number is $i"
    done
    
    • 1
    • 2
    • 3
    • 4

2.ενώ

  • γραμματική: εδώtest commandκαιif-elseΗ μορφή της δήλωσης είναι η ίδια και μπορείτε να χρησιμοποιήσετε οποιαδήποτε εντολή bash

    • Ειδοποίησηwhileτουtest commandΟ κωδικός κατάστασης εξόδου πρέπει να αλλάξει με την εντολή στον βρόχο Διαφορετικά, εάν ο κωδικός κατάστασης δεν αλλάξει, ο βρόχος θα συνεχιστεί συνεχώς.
      while test command
      do
      	commands
      done
      
      • 1
      • 2
      • 3
      • 4
  • whileΣειράΜπορούν να γραφτούν πολλαπλές εντολές δοκιμής

    • μόνοΟ κωδικός κατάστασης εξόδου της τελευταίας εντολής δοκιμής θα χρησιμοποιηθεί για να καθοριστεί εάν θα βγείτε από τον βρόχο.
    • Δώστε προσοχή στα διαλείμματα γραμμής, πολλαπλές εντολές δοκιμής θα πρέπει να εμφανίζονται ξεχωριστά σε κάθε γραμμή
      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.μέχρι εντολής

  • untilκαιwhileΝαίαντίθετο νόημαuntilΗ εντολή απαιτεί να καθορίσετε aΔοκιμή εντολών που επιστρέφουν μη μηδενικούς κωδικούς εξόδου
    • Μόνο αν ο κωδικός κατάστασης εξόδου δεν είναι 0, το bash θα εκτελέσει την εντολή βρόχου
  • γραμματική
    until test commands
    do
    	other commands
    done
    
    • 1
    • 2
    • 3
    • 4
  • untilεπίσηςΥποστηρίζει πολλαπλές εντολές δοκιμής, μόνο το τελευταίο καθορίζει εάν το bash εκτελεί άλλες εντολές
    until echo $var1
    	[ $var1 -eq 0 ]
    do
    	echo "Inside the loop:$var1"
    	var1=$[ $var1 - 25 ]
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

4. Βρόχος ελέγχου

1.σπάσιμο

  • αποτέλεσμα:Αναγκαστική έξοδος από οποιονδήποτε τύπο βρόχου
    • Όταν πηδάτε από πολλαπλούς βρόχους,breakΘα τερματίσει αυτόματα τον περισσότερο βρόχο μνήμης στον οποίο βρίσκεται
  • Τερματίστε τον εξωτερικό βρόχοnΥποδεικνύει το επίπεδο βρόχου από το οποίο πρέπει να βγείτε Η προεπιλογή είναι 1 και το επόμενο επίπεδο είναι 2.
    break n
    
    • 1

2.συνέχεια

  • αποτέλεσμα: Παραλείψτε ένα συγκεκριμένο βρόχο και μεταβείτε απευθείας στο τμήμα κρίσης αυτού του βρόχου.

5. Επεξεργαστείτε την έξοδο του βρόχου

  • Στο σενάριο φλοιού, το αποτέλεσμα μετά την έξοδο βρόχου μπορεί να είναιΑνακατεύθυνση εξόδου
    for (( a = 1;a<10;a++ ))
    do
    	echo "The number is $a"
    done > test.txt
    echo "Finished"
    
    • 1
    • 2
    • 3
    • 4
    • 5