Linux-Shell
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
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
halloworldAbsoluter Pfad zu sh+script
[guozihan@hadoop100-Programm]$ sh /home/guozihan/Desktop/program/helloworld.sh
HalloweltRelativer Pfad zum Bash+Skript
[guozihan@hadoop100 Programm]$ bash ./helloworld.sh
halloworldRelativer 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/guozihanAlle 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
5Weisen Sie der Variablen A einen Wert zu
[guozihan@hadoop100 ~]$ A=8
[guozihan@hadoop100 ~]$ echo $A
8Variable 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 VariableIn 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+2Wenn 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 SunchenVariablen 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 $?
0Hat 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 $?
1Urteil 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 变量 in 值 1 值 2 值 3… do 程序 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