Linux-Shell (1)

Shell-Übersicht

Shell ist einBefehlszeileninterpreter, der Anwendungs-/Benutzerbefehle empfängt und dann den Betriebssystemkernel aufruft

Shell ist auch eine sehr leistungsfähige Programmiersprache.Einfach zu schreiben, leicht zu debuggen und flexibel

Fügen Sie hier eine Bildbeschreibung ein

Von Linux bereitgestellter Shell-Parser

[guozihan@hadoop100 ~]$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

Die Beziehung zwischen Bash und Sh

-rwxr-xr-x. 1 Root Root 964536 25.11.2021 Bash
lrwxrwxrwx. 1 Root Root 10 25.08.20:20 Bashbug -> Bashbug-64
-rwxr-xr-x. 1 Root Root 6964 25.11.2021 Bashbug-64
lrwxrwxrwx. 1 Wurzel Wurzel 4 25.08. 20:20 sh -> bash

Der Standardparser auf Centos ist Bash

[guozihan@hadoop100 bin]$ echo $SHELL
/bin/bash

Erste Schritte mit Shell-Scripting

Skriptformat

Das Skript beginnt mit ==#!/bin/bash== (gibt den Parser an)

erstes Drehbuch

Anforderungen: Erstellen Sie ein Shell-Skript zur Ausgabe von helloworld

  • Praxisbeispiele

    Zuerst erstellen wir den Ordner program, erstellen dann die sh-Datei im Ordner und bearbeiten sie mit vim

    [guozihan@hadoop100 Desktop]$ mkdir-Programm

    [guozihan@hadoop100 Desktop]$ cd Programm/

    [guozihan@hadoop100-Programm]$ touch helloword.sh

    [guozihan@hadoop100 Programm]$ vim helloword.sh

    #!/bin/bash
    echo "helloworld"
    

Häufig verwendete Ausführungsmethoden von Skripten

  • Verwenden Sie den relativen oder absoluten Pfad des Bash- oder Sh+-Skripts (Für das Skript muss keine +x-Berechtigung erteilt werden

    Relativer Pfad zum sh+script

    [guozihan@hadoop100-Programm]$ sh ./helloworld.sh
    halloworld

    Absoluter Pfad zu sh+script

    [guozihan@hadoop100-Programm]$ sh /home/guozihan/Desktop/program/helloworld.sh
    Hallowelt

    Relativer Pfad zum Bash+Skript

    [guozihan@hadoop100 Programm]$ bash ./helloworld.sh
    halloworld

    Relativer Pfad zum Bash+Skript

    [guozihan@hadoop100-Programm]$ bash /home/guozihan/桌面/program/helloworld.sh
    halloworld

  • Führen Sie das Skript unter Verwendung des absoluten Pfads oder relativen Pfads des Eingabeskripts aus (Muss über die ausführbare Berechtigung +x verfügen

    ①Gewähren Sie zunächst dem Skript helloworld.sh die Berechtigung +x

    [guozihan@hadoop100 Programm]$ chmod +x helloworld.sh

    ②Führen Sie das Skript aus

    [guozihan@hadoop100 Programm]$ ./helloworld.sh
    halloworld

    [guozihan@hadoop100-Programm]$ /home/guozihan/桌面/program/helloworld.sh
    halloworld

Hinweis: Die erste Ausführungsmethode ermöglicht im Wesentlichen, dass der Bash-Parser das Skript für Sie ausführt, sodass für das Skript selbst keine Ausführungsberechtigungen erforderlich sind. Die zweite Ausführungsmethode bedeutet im Wesentlichen, dass das Skript dies tun muss

Ausführen, daher ist eine Ausführungsberechtigung erforderlich.

  • Fügen Sie „.“ oder Quelle vor dem Pfad des Skripts hinzu

    ①Vorhandene Datei test.sh, der Inhalt ist wie folgt

    #!/bin/bash

    A=5

    echo $A

    ②Verwenden Sie zur Ausführung sh, bash, ./ und .. Die Ergebnisse sind wie folgt

    [guozihan@hadoop100 Programm]$ bash test.sh
    5

    [guozihan@hadoop100 Programm]$ sh test.sh
    5

    [guozihan@hadoop100 Programm]$ chmod +x test.sh

    [guozihan@hadoop100 Programm]$ ./test.sh
    5

    [guozihan@hadoop100 Programm]$ . test.sh
    5

Grund:

Die ersten beiden Methoden öffnen eine Subshell in der aktuellen Shell, um den Skriptinhalt auszuführen. Wenn der Skriptinhalt endet, wird die Subshell geschlossen und kehrt zur übergeordneten Shell zurück.

Die dritte Methode besteht darin, vor dem Skriptpfad „.“ oder „source“ hinzuzufügen, sodass der Skriptinhalt in der aktuellen Shell ausgeführt werden kann, ohne eine Subshell zu öffnen.! Aus diesem Grund müssen wir jedes Mal eine Quelle angeben, wenn wir die Datei /etc/profile ändern.

Der Unterschied zwischen dem Öffnen einer Subshell und dem Nichtöffnen einer Subshell besteht darin, dass die Vererbungsbeziehung von Umgebungsvariablen, z. B. den in der Subshell festgelegten aktuellen Variablen, für die übergeordnete Shell nicht sichtbar ist.

Variable

Vom System vordefinierte Variablen

  • Häufig verwendete Systemvariablen

    $HOME、$PWD、$SHELL、$USER 等

  • Fallpraxis

    Sehen Sie sich den Wert von Systemvariablen an

    [guozihan@hadoop100 ~]$ echo $HOME
    /home/guozihan

    Alle Variablen in der aktuellen Shell anzeigen: set

    [guozihan@hadoop100 ~]$ gesetzt

Benutzerdefinierte Variablen

  • Grundgrammatik

    (1) Variablen definieren: Variablenname = Variablenwert, Hinweis, =Vor und nach der Zahl dürfen keine Leerzeichen stehen

    (2) Unset-Variable: Unset-Variablenname

    (3) Statische Variablen deklarieren: schreibgeschützte Variablen, Hinweis:kann nicht deaktiviert werden

  • Regeln zur Variablendefinition

    (1)Variablennamen können aus Buchstaben, Zahlen und Unterstrichen bestehen, dürfen jedoch nicht mit einer Zahl beginnenwird empfohlen, die Namen der Umgebungsvariablen in Großbuchstaben zu schreiben.

    (2)Auf beiden Seiten des Gleichheitszeichens dürfen keine Leerzeichen stehen

    (3)In Bash sind die Standardtypen von Variablen alle Zeichenfolgentypen, und numerische Operationen können nicht direkt ausgeführt werden.

    (4)Wenn der Wert der Variablen Leerzeichen enthält, muss er in doppelte oder einfache Anführungszeichen eingeschlossen werden.

  • Fallpraxis

    Definieren Sie Variable A

    [guozihan@hadoop100 ~]$ A=5

    [guozihan@hadoop100 ~]$ echo $A
    5

    Weisen Sie der Variablen A einen Wert zu

    [guozihan@hadoop100 ~]$ A=8

    [guozihan@hadoop100 ~]$ echo $A
    8

    Variable A rückgängig machen

    [guozihan@hadoop100 ~]$ unset A

    [guozihan@hadoop100 ~]$ echo $A

    Deklarieren Sie die statische Variable B=2 und können Sie sie nicht zurücksetzen

    [guozihan@hadoop100 ~]$ schreibgeschützt B=2

    [guozihan@hadoop100 ~]$ echo $B
    2

    [guozihan@hadoop100 ~]$ B=9
    -bash: B: schreibgeschützte Variable

    In Bash sind die Standardtypen von Variablen alle Zeichenfolgentypen, und numerische Operationen können nicht direkt ausgeführt werden.

    [guozihan@hadoop100 ~]$ C=1+2

    [guozihan@hadoop100 ~]$ echo $C
    1+2

    Wenn der Wert der Variablen Leerzeichen enthält, muss er in doppelte oder einfache Anführungszeichen eingeschlossen werden.

    [guozihan@hadoop100 ~]$ D=Ich liebe sunchen
    bash: love: Befehl nicht gefunden…

    [guozihan@hadoop100 ~]$ D=„Ich liebe Sunchen“

    [guozihan@hadoop100 ~]$ echo $D
    Ich liebe Sunchen

    Variablen können zu globalen Umgebungsvariablen hochgestuft und von anderen Shell-Programmen verwendet werden.

    Variablen exportieren

    Fügen Sie echo $B zur Datei helloworld.sh hinzu

    #!/bin/bash 
    
    echo "helloworld" 
    echo $B
    

    [guozihan@hadoop100 Programm]$ ./helloworld.sh
    halloworld

    [guozihan@hadoop100 Programm]$ export B

    [guozihan@hadoop100 Programm]$ ./helloworld.sh
    halloworld
    2

spezielle Variablen

$n

  • Grundgrammatik

    $nFunktionsbeschreibung: n ist eine Zahl, $0 stellt den Skriptnamen dar, $1-$9 stellt den ersten bis neunten Parameter dar und Parameter über zehn müssen in geschweifte Klammern eingeschlossen werden, z. B. ${10})

  • Fallpraxis

    [guozihan@hadoop100 Programm]$ touch parameter.sh

    [guozihan@hadoop100 Programm]$ vim parameter.sh

    #!/bin/bash
    echo '=$n='
    echo $0
    echo $1
    echo $
    

    [guozihan@hadoop100 Programm]$ chmod 777 Parameter.sh

    [guozihan@hadoop100 Programm]$ ./parameter.sh cls xz
    =$n=
    ./parameter.sh
    cls
    xz

$#

  • Grundgrammatik

    $#Funktionsbeschreibung: Ruft die Anzahl aller Eingabeparameter ab. Wird häufig in Schleifen verwendet, um festzustellen, ob die Anzahl der Parameter korrekt ist, und um die Robustheit des Skripts zu verbessern.

  • Praxisbeispiele

    [guozihan@hadoop100 Programm]$ vim parameter.sh

    #!/bin/bash
    echo '==========$n=========='
    echo $0
    echo $1
    echo $2
    echo '==========$#=========='
    echo $
    

    [guozihan@hadoop100 Programm]$ chmod 777 Parameter.sh

    [guozihan@hadoop100 Programm]$ ./parameter.sh cls xz
    =$n=
    ./parameter.sh
    cls
    xz
    =$n=
    2

$*、$@

  • Grundgrammatik

    $*Funktionsbeschreibung: Diese Variable stellt alle Parameter in der Befehlszeile dar. $* behandelt alle Parameter als Ganzes.

    $@Funktionsbeschreibung: Diese Variable repräsentiert auch alle Parameter in der Befehlszeile, $@ behandelt jedoch jeden Parameter unterschiedlich.

  • Fallpraxis

    [guozihan@hadoop100 Programm]$ vim parameter.sh

    #!/bin/bash
    echo '==========$n=========='
    echo $0
    echo $1
    echo $2
    echo '==========$#=========='
    echo $#
    echo '==========$*=========='
    echo $*
    echo '==========$@=========='
    echo $@
    

    [guozihan@hadoop100 Programm]$ ./parameter.sh abcdefg
    =$n=
    ./parameter.sh
    a
    b
    =$n=
    7
    =$n=
    abcdefg
    =$n=
    abcdefg

$?

  • Grundgrammatik

    $?Funktionsbeschreibung: Rückgabestatus des zuletzt ausgeführten Befehls. Wenn der Wert dieser Variablen 0 ist, beweist dies, dass der vorherige Befehl korrekt ausgeführt wurde. Wenn der Wert dieser Variablen nicht 0 ist (die spezifische Zahl wird durch den Befehl selbst bestimmt), beweist dies, dass der vorherige Befehl falsch ausgeführt wurde .

  • Fallpraxis

    Stellen Sie fest, ob das Skript helloworld.sh korrekt ausgeführt wird

    [guozihan@hadoop100 Programm]$ ./helloworld.sh
    halloworld

    [guozihan@hadoop100 Programm]$ echo $?
    0

Operator

  • Grundgrammatik

    „$((operationaler Ausdruck))“ oder „$[operationaler Ausdruck]“

  • Fallpraxis

    Berechnen Sie den Wert von (2+3)*4

    [guozihan@hadoop100 Programm]$ S=$[(2+3)*4]

    [guozihan@hadoop100 Programm]$ echo $S
    20

Bedingtes Urteil

  • Grundgrammatik

    (1) Testbedingung

    (2) [Bedingung] ( Beachten Sie, dass vor und nach der Bedingung Leerzeichen stehen sollten )

    Hinweis: Wenn die Bedingung nicht leer ist, bedeutet dies wahr, [guozihan] gibt wahr zurück, [] gibt falsch zurück

  • Allgemeine Urteilsbedingungen

    • Vergleichen Sie zwei ganze Zahlen

      -eq ist gleich (gleich)

      -ne ist nicht gleich (nicht gleich)

      -lt kleiner als (kleiner als)

      -le kleiner als gleich (weniger gleich)

      -gt größer als (größer als)

      -ge größer gleich

      Hinweis: Wenn es sich um einen Vergleich zwischen Zeichenfolgen handelt, verwenden Sie das Gleichheitszeichen „=", um die Gleichheit zu beurteilen; verwenden Sie „!=", um die Ungleichheit zu beurteilen.

    • Bestimmen Sie anhand der Dateiberechtigungen

      -r hat Leseberechtigung (read)

      -w hat Schreibberechtigung (Schreiben)

      -x hat Ausführungsberechtigung (execute)

    • Beurteilen Sie anhand des Dateityps

      -e-Datei existiert

      -f Die Datei existiert und ist eine reguläre Datei

      -d Die Datei existiert und ist ein Verzeichnis

  • Fallpraxis

    Ist 23 größer oder gleich 22?

    [guozihan@hadoop100 Programm]$ [ 23 -ge 22 ]

    [guozihan@hadoop100 Programm]$ echo $?
    0

    Hat helloworld.sh eine Schreibberechtigung?

    [guozihan@hadoop100-Programm]$ [ -w helloworld.sh ]

    [guozihan@hadoop100 Programm]$ echo $?

    0

    Existiert die Datei im Verzeichnis /home/atguigu/cls.txt?

    [guozihan@hadoop100-Programm]$ [ -e /home/guozihan/cls.txt ]

    [guozihan@hadoop100 Programm]$ echo $?
    1

    Urteil mit mehreren Bedingungen( && bedeutet, dass der nächste Befehl nur ausgeführt wird, wenn der vorherige Befehl erfolgreich ausgeführt wurde. || bedeutet, dass der nächste Befehl erst ausgeführt wird, wenn die Ausführung des vorherigen Befehls fehlgeschlagen ist. )

    [guozihan@hadoop100 Programm]$ [ guozihan ] && echo OK || echo notOK
    OK

    [ guozihan@hadoop100 Programm ] $ [ ] && echo OK || Echo nicht in Ordnung,
    nicht in Ordnung

Prozesskontrolle(▲)

wenn Urteil

  • Grundgrammatik

    • einzelner Zweig

      if [ 条件判断式 ];then
      	程序
      fi
      

      oder

      if [ 条件判断式 ]
      then
      程序
      fi
      
    • mehrere Filialen

      if [ 条件判断式 ]
      then
      	程序
      elif [ 条件判断式 ]
      then
      	程序
      else
      	程序
      fi
      

    Vorsichtsmaßnahmen:

    ①[Bedingter Beurteilungsausdruck]: Zwischen den eckigen Klammern und dem bedingten Beurteilungsausdruck muss ein Leerzeichen stehen

    ②Nach if muss ein Leerzeichen stehen

  • Fallpraxis

    Geben Sie eine Zahl ein. Wenn es 1 ist, wird banzhang zhen shuai ausgegeben. Wenn es 2 ist, wird cls zhen mei ausgegeben. Wenn es anders ist, wird nichts ausgegeben.

    [guozihan@hadoop100 program]$ touch if.sh
    [guozihan@hadoop100 program]$ vim if.sh
    
    #!/bin/bash
    if [ $1 -eq 1 ]
    then
    echo "banzhang zhen shuai"
    elif [ $1 -eq 2 ]
    then
    echo "cls zhen mei"
    fi
    
    [guozihan@hadoop100 program]$ chmod 777 if.sh
    [guozihan@hadoop100 program]$ ./if.sh 1
    banzhang zhen shuai
    [guozihan@hadoop100 program]$ ./if.sh 2
    cls zhen mei
    

Fallerklärung

  • Grundgrammatik

    case $Variablenname in

    „Wert 1“)

    ​ Wenn der Wert der Variablen gleich dem Wert 1 ist, führen Sie Programm 1 aus

    ;;

    „Wert 2“)

    ​ Wenn der Wert der Variablen gleich Wert 2 ist, führen Sie Programm 2 aus

    ;;

    ​ …Andere Zweige weglassen…

    *)

    ​ Wenn der Wert der Variablen nicht dem oben genannten Wert entspricht, führen Sie dieses Programm aus

    ;;

    esac

    Vorsichtsmaßnahmen:

    (1) Das Ende der Groß-/Kleinschreibung muss das Wort „in“ sein und jede Musterübereinstimmung muss mit einer rechten Klammer „)“ enden.

    (2) Das doppelte Semikolon „;;“ gibt das Ende der Befehlssequenz an, was in Java einer Unterbrechung entspricht.

    (3) Das letzte „*)“ gibt den Standardmodus an, der Java entspricht

  • Fallpraxis

    Geben Sie eine Zahl ein, wenn es 1 ist, geben Sie Banzhang aus, wenn es 2 ist, geben Sie cls aus, wenn es anders ist, geben Sie renyao aus.

    [guozihan@hadoop100 program]$ touch case.sh
    [guozihan@hadoop100 program]$ vim case.sh
    
    #!/bin/bash
    case $1 in
    "1")
    echo "banzhang"
    ;;
    "2")
    echo "cls"
    ;;
    *)
    echo "renyao"
    ;;
    esac
    
    [guozihan@hadoop100 program]$ chmod 777 case.sh 
    [guozihan@hadoop100 program]$ ./case.sh 
    renyao
    [guozihan@hadoop100 program]$ ./case.sh 1
    banzhang
    
    

for-Schleife

  • Grundgrammatik 1

    for (( 初始值;循环控制条件;变量变化 ))
    do
    	程序
    done
    
  • Fallpraxis 1

    Addieren Sie 1 bis 100

    [guozihan@hadoop100 program]$ touch for1.sh
    [guozihan@hadoop100 program]$ vim for1.sh 
    
    #!/bin/bash
    sum=0
    for((i=0;i<=100;i++))
    do
    sum=$[$sum+$i]
    done
    echo $sum
    
    [guozihan@hadoop100 program]$ chmod 777 for1.sh 
    [guozihan@hadoop100 program]$ ./for1.sh 
    5050
    
  • Grundlegende Grammatik 2

    for 变量 in123do
    程序
    done
    
  • Fallpraxis 2

    Drucken Sie alle Eingabeparameter

    [guozihan@hadoop100 program]$ touch for2.sh
    [guozihan@hadoop100 program]$ vim for2.sh 
    
    #!/bin/bash
    #打印数字
    for i in cls mly wls
    do
    echo "ban zhang love $i"
    done
    
    [guozihan@hadoop100 program]$ chmod 777 for2.sh 
    [guozihan@hadoop100 program]$ ./for2.sh 
    ban zhang love cls
    ban zhang love mly
    ban zhang love wls
    
  • Der Unterschied zwischen $* und $@

    Sowohl $* als auch $@ stellen alle Parameter dar, die an eine Funktion oder ein Skript übergeben werden, wenn nicht in doppelte Anführungszeichen „“ eingeschlossen, werden alle Parameter in der Form $1 $2...$n ausgegeben.

    Wenn sie in doppelte Anführungszeichen „“ eingeschlossen werden, gibt $* alle Parameter als Ganzes in der Form „$1 $2...$n“ aus; $@ trennt jeden Parameter in der Form „$1“ „$2“ . ..alle Parameter im Format „$n“ ausgeben

while-Schleife

  • Grundgrammatik

    while [ 条件判断式 ]
    do
    程序
    done
    
  • Fallpraxis

    Addieren Sie 1 bis 100

    [guozihan@hadoop100 program]$ touch while.sh
    [guozihan@hadoop100 program]$ vim while.sh 
    
    #!/bin/bash
    sum=0
    i=1
    while [ $i -le 100 ]
    do
    sum=$[$sum+$i]
    i=$[$i+1]
    done
    echo $sum
    
    [guozihan@hadoop100 program]$ chmod 777 while.sh 
    [guozihan@hadoop100 program]$ ./while.sh 
    5050
    

read liest Konsoleneingaben

  • Grundgrammatik

    lesen (Option) (Parameter)

    ①Option:

    -p: Gibt die Eingabeaufforderung beim Lesen des Werts an;

    -t: Geben Sie die Wartezeit (Sekunden) beim Lesen des Werts an. Wenn -t nicht hinzugefügt wird, bedeutet dies, dass ewig gewartet wird.

    ②Parameter

    Variable: Geben Sie den Variablennamen an, um den Wert zu lesen

  • Fallpraxis

    Lesen Sie innerhalb von 7 Sekunden den von der Konsole eingegebenen Namen.

    [guozihan@hadoop100 program]$ touch read.sh
    [guozihan@hadoop100 program]$ vim read.sh 
    
    #!/bin/bash
    read -t 7 -p "Enter your name in 7 seconds :" NN
    echo $NN
    
    [guozihan@hadoop100 program]$ chmod 777 read.sh 
    [guozihan@hadoop100 program]$ ./read.sh 
    Enter your name in 7 senconds:guozihan
    guozihan
    

Supongo que te gusta

Origin blog.csdn.net/pipihan21/article/details/132580049
Recomendado
Clasificación