Lernen von Shell-Skripten
- 1. Was ist Shell?
- 2. Shell-Variablen
- 3. Shell-Betreiber
- 4. Prozesskontrolle
- 5. Funktion
- 6. Befehle zum Abfangen, Ersetzen und Verarbeiten von Zeichen
- 7. Eingabe- und Ausgabeumleitung
1. Was ist Shell?
1. Shell-Übersicht
Shell ist eine Befehlszeilenschnittstelle (CLI) in einem Computerbetriebssystem, die es Benutzern ermöglicht, mit dem Betriebssystem zu interagieren und verschiedene Aufgaben und Vorgänge auszuführen. Shell ist außerdem eine Skript-Programmiersprache, mit der Benutzer Skripts schreiben können, um Aufgaben zu automatisieren und eine Reihe von Befehlen auszuführen
In Linux- und Unix-Betriebssystemen Shell 是用户与操作系统内核之间的中间层
akzeptiert es vom Benutzer eingegebene Befehle und übergibt diese Befehle zur Ausführung an den Kernel. Benutzer können Befehle über die Tastatur eingeben, und die Shell schält 解释和执行
diese Befehle dann ab. 输入和输出、环境变量、文件操作
Die Shell ist auch für die Verarbeitung usw. verantwortlich.
Einige gängige Shells sind Bash (Bourne-Again Shell), Zsh (Z Shell), Fish (Friendly Interactive Shell) usw. Jede Shell hat ihre eigenen Eigenschaften und Funktionen. Bash ist die häufigste Standard-Shell unter Linux und macOS
Zu den Hauptanwendungen von Shell gehören:
- Befehle und Programme ausführen: Benutzer können Befehle in die Shell eingeben, um Programme auszuführen, Dateien zu verwalten, den Systemstatus anzuzeigen usw.
- Skriptprogrammierung: Benutzer können Shell-Skripte schreiben, um eine Reihe von Befehlen und Vorgängen zu kombinieren und so automatisierte Aufgaben auszuführen
- Pipes und Umleitung: Mit der Shell können Benutzer die Ausgabe von Befehlen an andere Befehle weiterleiten sowie Ein- und Ausgaben an Dateien oder Geräte umleiten
- Verwaltung von Umgebungsvariablen: Shell ermöglicht Benutzern das Festlegen und Verwalten von Umgebungsvariablen, die sich auf die laufende Umgebung von Benutzern und Programmen auswirken.
- Prozesssteuerung: Shell unterstützt bedingte Anweisungen, Schleifen und Verzweigungen, sodass Benutzer komplexe Skriptlogik schreiben können
2. Klassifizierung von Muscheln
Shell-Programmierung erfordert, wie JavaScript- und PHP-Programmierung, einen Texteditor, der Code schreiben kann, und einen Skriptinterpreter, der ihn interpretieren und ausführen kann. Es gibt viele
Arten von Shells in Linux, und die häufigsten sind:
- Bourne Shell (/usr/bin/sh oder /bin/sh)
- Bourne Again Shell (/bin/bash)
- C-Shell (/usr/bin/csh)
- K-Shell (/usr/bin/ksh)
- Shell für Root (/sbin/sh)
Dieses Tutorial konzentriert sich auf Bash, auch bekannt als Bourne Again Shell. Da es einfach zu verwenden und kostenlos ist, wird Bash häufig in der täglichen Arbeit verwendet. Gleichzeitig ist Bash auch die Standard-Shell für die meisten Linux-Systeme.
Im Allgemeinen wird nicht zwischen Bourne Shell und Bourne Again Shell unterschieden#!/bin/sh同样也可以改为 #!/bin/bash
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序
3. Das erste Shell-Skript
# 1. vim helloworld.sh 是打开一个文本编辑器(Vim)并创建或打开名为 "helloworld.sh" 的文件的命令
vim helloworld.sh
# 2. echo "hello, world!" 是一个 Shell 命令。作用是在终端上打印 "hello, world!"
echo "hello,world!"
# 3. 用于为一个文件赋予可执行权限
chmod +x helloworld.sh
# 4. 运行这个脚本的命令
./helloworld.sh
- Der Ausführungseffekt ist wie folgt:
4. Ausführung mehrerer Befehle
Mehrere Befehlsausführer | Wirkung | Format |
---|---|---|
; | Mehrere Befehle werden nacheinander ausgeführt, ohne dass eine logische Verbindung zwischen den Befehlen besteht. | Befehl 1; Befehl 2 |
&& | Wenn Befehl 1 korrekt ausgeführt wird (Exit-Statuscode ist 0), wird Befehl 2 ausgeführt; andernfalls wird Befehl 2 nicht ausgeführt. | Befehl 1 && Befehl 2 |
|| | Befehl 2 wird nur ausgeführt, wenn Befehl 1 fehlerhaft ausgeführt wird (der Exit-Statuscode ist nicht 0); andernfalls wird Befehl 2 nicht ausgeführt. | Befehl 1 || Befehl 2 |
Beispiel für die Ausführung mehrerer Befehle:
-
Das Semikolon (;) wird verwendet, um mehrere Befehle nacheinander auszuführen, und es besteht keine logische Verbindung zwischen den Befehlen:
$ command1 ; command2 ; command3
Beispiel:
$ ls ; echo "Hello" ; date
Der obige Befehl führt
ls
den Befehl (Inhalt des aktuellen Verzeichnisses auflisten),echo
den Befehl (Druck „Hallo“) unddate
den Befehl (aktuelles Datum und Uhrzeit anzeigen) aus. -
Der logische UND-Operator (&&) wird nur dann zum Ausführen des nächsten Befehls verwendet, wenn der vorherige Befehl korrekt ausgeführt wurde:
$ command1 && command2
Beispiel:
$ rm file.txt && echo "File deleted successfully"
Der obige Befehl versucht zunächst, die Datei zu löschen
file.txt
. Wenn der Löschvorgang erfolgreich ist, führen Sieecho
den Befehl aus, um „Datei erfolgreich gelöscht“ anzuzeigen. Wenn das Löschen der Datei fehlschlägt (Befehl 1 wurde falsch ausgeführt),echo
wird der Befehl nicht ausgeführt. -
Der logische ODER-Operator (||) wird nur dann zum Ausführen des nächsten Befehls verwendet, wenn der vorherige Befehl falsch ausgeführt wurde:
$ command1 || command2
Beispiel:
$ find /tmp -name "file.txt" || echo "File not found"
Der obige Befehl versucht zunächst,
/tmp
eine Datei mit dem Namen „file.txt“ im Verzeichnis zu finden. Wenn die Datei gefunden wird (Befehl 1 korrekt ausgeführt),echo
wird der Befehl nicht ausgeführt. Wenn die Datei nicht gefunden wird (Befehl 1 wurde fehlerhaft ausgeführt),echo
wird der Befehl ausgeführt, um „Datei nicht gefunden“ anzuzeigen.
2. Shell-Variablen
3.1 Benennungsregeln für Variablen
In Shell-Skripten sind Variablen Schlüsselelemente zum Speichern und Bearbeiten von Daten. Die richtige Benennung von Variablen ist der Schlüssel zum Schreiben klarer, lesbarer und robuster Skripte. Im Folgenden sind die Benennungsregeln für Shell-Variablen aufgeführt:
-
Variablennamen können Folgendes enthalten:
- Buchstaben (Groß- oder Kleinbuchstaben): a bis z oder A bis Z.
- Zahlen: 0 bis 9 (Variablennamen dürfen jedoch nicht mit Zahlen beginnen).
- Unterstreichen
_
.
-
Variablennamen müssen mit einem Buchstaben oder einem Unterstrich beginnen. Es ist nicht erlaubt, mit einer Zahl zu beginnen.
-
Bei Variablennamen muss die Groß-/Kleinschreibung beachtet werden,
$myVar
es$myvar
handelt sich also um zwei verschiedene Variablen. -
Vermeiden Sie die Verwendung der reservierten Schlüsselwörter von Shell (z. B. if, while, for usw.) als Variablennamen
-
Es wird empfohlen, aussagekräftige, beschreibende Variablennamen zu verwenden, um die Lesbarkeit des Skripts zu verbessern.
-
Gängige Namensstile:
-
Camel Case: Das erste Wort beginnt mit einem Kleinbuchstaben und der erste Buchstabe der nachfolgenden Wörter wird großgeschrieben.
Beispiel:myVariableName
,thisIsCamelCase
. -
Unterstrich-Nomenklatur (Snake Case): Alle Buchstaben sind Kleinbuchstaben und Wörter werden
_
durch Unterstriche getrennt.
Zum Beispiel:my_variable_name
,this_is_snake_case
.
-
Beispiel:
Hier sind einige Beispiele, die verschiedene Regeln für die Benennung von Variablen veranschaulichen:
# 驼峰命名法示例
myVariableName="Hello, World!"
thisIsCamelCase="这是一个驼峰命名"
anotherCamelCaseVariable="这是另个驼峰命名"
# 下划线命名法示例
my_variable_name="Hello, World!"
this_is_snake_case="这是下划线命名"
another_snake_case_variable="这是另一个下划线命名"
Korrekte Regeln für die Benennung von Variablen sind eine der Grundlagen der Shell-Skriptprogrammierung. Sie tragen dazu bei, wartbaren und lesbaren Code zu schreiben, Fehler zu reduzieren und die Codequalität zu verbessern.
3.2 Spezielle Symbole für Variablen
-
$ : Das Dollarzeichen wird verwendet, um auf den Wert einer Variablen zu verweisen.
Beispiel:myVar="Hello" echo $myVar # 输出:Hello
-
* : Sternchen-Platzhalter, wird verwendet, um null oder mehr Zeichen zu finden.
Beispiel:ls *.txt # 列出所有以 ".txt" 结尾的文件
-
? : Fragezeichen-Platzhalter, der für jedes beliebige Zeichen verwendet wird.
Beispiel:ls file?.txt # 列出类似 "file1.txt"、"fileA.txt" 的文件
-
[] : Eckige Klammern werden zur Definition des Zeichensatzes verwendet und können mit jedem Zeichen in den eckigen Klammern übereinstimmen.
Beispiel:ls [aeiou]* # 列出以元音字母开头的文件
-
{ } : Klammern werden zum Erstellen von Befehlssequenzen oder zum Erweitern von Zeichenfolgen verwendet.
Beispiel:echo { A,B,C} # 输出:A B C
-
| : Der vertikale Balken wird verwendet, um die Ausgabe eines Befehls an einen anderen Befehl weiterzuleiten und so eine Pipe zu bilden.
Beispiel:cat file.txt | grep "pattern" # 在文件中搜索模式
-
; : Semikolon wird verwendet, um mehrere Befehle zu trennen, sodass mehrere Befehle in einer Zeile ausgeführt werden können.
Beispiel:command1; command2 # 依次执行两个命令
-
&& : Logischer UND-Operator, der verwendet wird, um zwei Befehle auszuführen und den zweiten Befehl erst auszuführen, nachdem der erste Befehl erfolgreich war.
Beispiel:make && make install # 如果 make 成功,则执行 make install
-
|| : Logischer ODER-Operator, der verwendet wird, um zwei Befehle auszuführen und den zweiten Befehl nur dann auszuführen, wenn der erste Befehl fehlschlägt.
Beispiel:command1 || echo "command1 failed" # 如果 command1 失败,则输出提示
-
\> : Das Größer-als-Symbol wird verwendet, um die Ausgabe eines Befehls in eine Datei umzuleiten.
Beispiel:echo "Hello, World!" > output.txt # 将文本写入文件
- >> : Das doppelte Größer-als-Symbol wird verwendet, um die Ausgabe eines Befehls an eine Datei anzuhängen.
Beispiel:
echo "More text" >> output.txt # 追加文本到文件
- < : Das Kleiner-als-Symbol wird verwendet, um den Inhalt einer Datei als Eingabe für einen Befehl umzuleiten.
Beispiel:
command < input.txt # 使用文件内容作为输入执行命令
- ` : Backticks werden verwendet, um den Befehl auszuführen und als String auszugeben.
Beispiel:
currentDate=`date` # 获取当前日期并存储为字符串
3.3 Benutzerdefinierte Variablen
Variablen werden von Shell-Skriptautoren definiert und zum Speichern von Zwischenergebnissen bestimmter Aufgaben oder Berechnungen verwendet. Der Gültigkeitsbereich ist der aktuelle Shell-Prozess oder das aktuelle Shell-Skript.
1. Variablen definieren:
In Shell-Skripten können Sie das Gleichheitszeichen (=) verwenden, um Variablen zu definieren. 变量名不应该包含空格,并且通常使用大写字母
, um sie von Systemumgebungsvariablen zu unterscheiden.
myVar="Hello, World"
2. Variablen zuweisen:
Um einer Variablen einen Wert zuzuweisen, verwenden Sie einfach das Gleichheitszeichen (=) für die Zuweisungsoperation.
myVar="New Value"
3. Variablen verwenden:
Um den Wert einer Variablen zu verwenden, stellen Sie der Variablen ein Dollarzeichen ($) voran.
echo $myVar
4. String-Verkettung:
Variablen können mit Strings verkettet werden.
greeting="Hello"
name="John"
echo "$greeting, $name!"
Beispiel:
[root@localhost shell]# NAME="cxk"
[root@localhost shell]# DOING="play-basketball"
[root@localhost shell]# echo $NAME $DOING
cxk play-basketball
[root@localhost shell]# echo "$NAME,$DOING!!!"
cxk,play-basketball!!!
5. Variablen exportieren:
Wenn Sie eine Variable in die Umgebung der aktuellen Shell exportieren möchten, damit auch andere untergeordnete Prozesse darauf zugreifen können, können Sie export
den Befehl verwenden.
export myVar="Exported Value"
6. Schreibgeschützte Variablen:
Eine Variable kann schreibgeschützt gemacht werden, um zu verhindern, dass ihr Wert geändert wird.
readonly myVar="This variable is read-only"
Beispiel:
[root@localhost shell]# var='cxk'
[root@localhost shell]# echo $var
cxk
[root@localhost shell]# var='rap'
[root@localhost shell]# echo $var
rap
[root@localhost shell]# readonly var='ikun'
[root@localhost shell]# echo $var
ikun
[root@localhost shell]# var='cxk'
-bash: var: 只读变量
7. Variablen löschen:
Variablen können mit unset
dem Befehl gelöscht werden.
unset myVar
Beispiel:
[root@localhost shell]# setVar='temp'
[root@localhost shell]# echo $setVar
temp
[root@localhost shell]# unset setVar
[root@localhost shell]# echo $setVar
8. Best Practices:
- Verwenden Sie aussagekräftige Variablennamen, um die Lesbarkeit des Codes zu verbessern.
- Verwenden Sie doppelte Anführungszeichen, um Variablen in Anführungszeichen zu setzen und Zeichenfolgen zu verarbeiten, die Leerzeichen oder Sonderzeichen enthalten.
- Vermeiden Sie die Verwendung von Großbuchstaben zum Definieren von Nicht-Umgebungsvariablen, um Konflikte mit Systemumgebungsvariablen zu vermeiden.
- Überprüfen Sie vor der Verwendung einer Variablen, ob diese definiert ist, um unerwartete Fehler zu vermeiden.
- Verwenden Sie diese Option
readonly
, um zu verhindern, dass Variablen, die nicht geändert werden sollten, versehentlich geändert werden. - Verwenden Sie diese Option
export
, um die Variable im untergeordneten Prozess verfügbar zu machen. - Fügen Sie Kommentare hinzu, um den Zweck von Variablen zu erläutern und die Wartbarkeit des Codes zu verbessern.
3.4 Umgebungsvariablen
1. Was sind Umgebungsvariablen?
Umgebungsvariablen sind Schlüssel-Wert-Paare, die auf Betriebssystemebene gespeichert werden und zum Speichern von Konfigurationsinformationen, Pfaden, Benutzereinstellungen usw. verwendet werden. Shell-Umgebungsvariablen sind für die Steuerung und Konfiguration des Systemverhaltens sehr wichtig
2. Überprüfen Sie die Umgebungsvariablen:
Verwenden Sie echo
den Befehl und das Dollarzeichen ($), um den Wert einer bestimmten Umgebungsvariablen anzuzeigen
. Geben Sie beispielsweise den Home-Verzeichnispfad des aktuellen Benutzers aus:
echo $HOME
3. Umgebungsvariablen festlegen:
Um Umgebungsvariablen festzulegen, können Sie export
den folgenden Befehl verwenden:
export MY_VARIABLE="Hello"
MY_VARIABLE
Dadurch wird eine Umgebungsvariable mit dem Namen erstellt und ihr Wert auf „Hallo“ gesetzt. Beachten Sie, dass diese Variable innerhalb der aktuellen Shell-Sitzung verfügbar ist.
4. Persistente Umgebungsvariablen:
Um eine Umgebungsvariable dauerhaft zu machen, fügen Sie sie normalerweise zur Shell-Konfigurationsdatei hinzu, z. B. .bashrc
oder .bash_profile
(für die Bash-Shell). Auf diese Weise wird die Variable jedes Mal automatisch gesetzt, wenn eine neue Shell-Sitzung gestartet wird.
5. Alle Umgebungsvariablen anzeigen:
Um alle definierten Umgebungsvariablen anzuzeigen, können Sie env
den folgenden Befehl verwenden:
env
Oder verwenden Sie printenv
den Befehl:
printenv
6. Umgebungsvariablen löschen:
Um Umgebungsvariablen zu löschen, können Sie unset
den folgenden Befehl verwenden:
unset MY_VARIABLE
7. Umgebungsvariablen verwenden:
Umgebungsvariablen sind in Skripten sehr nützlich und können zum Speichern von Konfigurationsinformationen oder Pfaden verwendet werden, zum Beispiel:
# 使用环境变量
echo "home路径的环境变量地址: $HOME"
8. Vom System vordefinierte Umgebungsvariablen:
Das Betriebssystem und die Shell definieren einige Umgebungsvariablen wie PATH
, HOME
usw. vor USER
, die für den Zugriff auf Systeminformationen oder die Konfiguration verwendet werden können.
9. Umgebungsvariablen importieren:
Beim Importieren von Umgebungsvariablen werden Umgebungsvariablen aus einer externen Datei oder Quelle in die aktuelle Shell-Sitzung geladen, sodass sie in der aktuellen Sitzung verfügbar sind. Wird normalerweise verwendet, um sicherzustellen, dass erforderliche Umgebungsvariablen definiert sind, bevor Konfigurationsinformationen aus einer Datei geladen, Umgebungsvariablen festgelegt oder andere Skripts ausgeführt werden.
In der Shell gibt es mehrere Möglichkeiten, Umgebungsvariablen zu importieren:
-
source
Befehl oder.
(Punkt) verwenden : Diese beiden Befehle werden verwendet, um die Befehle in der angegebenen Datei auszuführen und die Ergebnisse auf die aktuelle Shell-Sitzung anzuwenden. Wird normalerweise zum Laden von Umgebungsvariablendateien verwendet, z. B..env
.source .env # 或者 . .env
Wo
.env
ist die Datei, die Umgebungsvariablendefinitionen enthält? Nach der Ausführung dieser Befehle.env
werden die in der Datei definierten Umgebungsvariablen in der aktuellen Shell-Sitzung wirksam. -
Verwenden
export
des Befehls: Wenn Sie Umgebungsvariablen in die aktuelle Shell-Sitzung importieren und in untergeordneten Prozessen verfügbar machen möchten, können Sieexport
den folgenden Befehl verwenden:export MY_VARIABLE="Hello"
Dadurch wird eine Umgebungsvariable mit dem Namen in der aktuellen Shell-Sitzung erstellt
MY_VARIABLE
und in der aktuellen Sitzung und ihren untergeordneten Prozessen verfügbar gemacht. -
Pass
~/.bashrc
or~/.bash_profile
: Wenn Sie möchten, dass die Umgebungsvariablen jedes Mal automatisch importiert werden, wenn Sie eine neue Bash-Shell-Sitzung starten, können Sie sie zur Datei.bashrc
or.bash_profile
im Home-Verzeichnis des Benutzers hinzufügen. Auf diese Weise werden die Umgebungsvariablen bei jeder Anmeldung automatisch festgelegt.Sie können der Datei beispielsweise
.bashrc
die folgende Zeile hinzufügen, um Umgebungsvariablen zu importieren:source /path/to/myenvfile
10. Best Practices:
- Verwenden Sie aussagekräftige Variablennamen, um die Lesbarkeit des Codes zu verbessern.
- Vermeiden Sie das Überschreiben vordefinierter Systemumgebungsvariablen, um unnötige Probleme zu vermeiden.
- Wenn vertrauliche Informationen (z. B. Passwörter) erforderlich sind, vermeiden Sie die Speicherung in Umgebungsvariablen, da Umgebungsvariablen im Allgemeinen keine sichere Möglichkeit zum Speichern dieser Informationen darstellen.
3.5 Positionsparametervariablen
- Diese Variablen werden verwendet, um Befehlszeilenargumente in Shell-Skripten abzurufen.
$0
Gibt den Namen des Skripts an,$1
gibt den ersten Parameter an,$2
gibt den zweiten Parameter an und so weiter.- Beispiel:
script.sh arg1 arg2 # 在脚本内部可以使用 $0、$1、$2 获取参数
3.6 Vordefinierte Variablen
- Die Shell stellt einige spezielle vordefinierte Variablen bereit, um Informationen über die Shell und das System zu erhalten.
- Es stellt beispielsweise
$HOME
das Home-Verzeichnis des aktuellen Benutzers und$PWD
das aktuelle Arbeitsverzeichnis dar. - Beispiel:
echo "当前用户的主目录是 $HOME"
3.7 Akzeptieren Sie Tastatureingaben
- Diese Variablen werden verwendet, um Tastatureingaben des Benutzers zu akzeptieren.
- Beispielsweise
read
wird ein Befehl verwendet, um Benutzereingaben in einer angegebenen Variablen zu speichern. - Beispiel:
echo "请输入您的姓名:" read userName echo "您输入的姓名是:$userName"
3. Shell-Betreiber
Im Folgenden finden Sie die Syntax und Beispiele gängiger Operatoren in Shell-Skripten
Betreibertyp | Operator | Syntaxbeispiel | Beispiel |
---|---|---|---|
Rechenzeichen | Zusatz | result=$((a + b)) |
5 + 2 Das Ergebnis ist7 |
Subtraktion | result=$((a - b)) |
5 - 2 Das Ergebnis ist3 |
|
Multiplikation | result=$((a * b)) |
5 * 2 Das Ergebnis ist10 |
|
Aufteilung | result=$((a / b)) |
10 / 3 Das Ergebnis ist3 |
|
Rest nehmen | result=$((a % b)) |
15 % 7 Das Ergebnis ist1 |
|
Vergleichsoperatoren | gleich | [ "$a" -eq "$b" ] |
5 -eq 5 ist wahr |
Nicht gleichzusetzen mit | [ "$a" -ne "$b" ] |
5 -ne 2 ist wahr |
|
mehr als die | [ "$a" -gt "$b" ] |
5 -gt 2 ist wahr |
|
weniger als | [ "$a" -lt "$b" ] |
5 -lt 10 ist wahr |
|
größer oder gleich | [ "$a" -ge "$b" ] |
5 -ge 5 ist wahr |
|
Gleich oder kleiner als | [ "$a" -le "$b" ] |
5 -le 10 ist wahr |
|
Logische Operatoren | UND-Verknüpfung | [ "$a" -gt 0 ] && [ "$a" -lt 10 ] |
5 > 0 und 5 < 10 ist wahr |
ODER-Verknüpfung | [ "$a" -eq 0 ] || [ "$a" -eq 10 ] |
5 = 0 oder 5 = 10 ist falsch |
|
KEIN Betrieb | ! [ "$a" -eq 5 ] |
5 = 5 ist falsch |
|
Aufgabenverwalter | Abtretung | x=10 |
x gleich10 |
additive Zuordnung | x=$((x + 5)) |
x 5 Nach der Addition x gleich15 |
|
subtraktive Zuordnung | y=$((y - 5)) |
y minus 5 gleich y _15 |
|
Bitoperatoren | Bitweises UND | result=$((a & b)) |
5 & 3 Das Ergebnis ist1 |
Bitweises ODER | result=$((a | b)) |
5 | 3 Das Ergebnis ist7 |
|
Bitweises XOR | result=$((a ^ b)) |
5 ^ 3 Das Ergebnis ist6 |
|
Bitweise Negation | result=$((~a)) |
~5 Das Ergebnis ist-6 |
|
Linksverschiebung | result=$((a << 2)) |
5 << 2 Das Ergebnis ist20 |
|
Verschiebung nach rechts | result=$((a >> 1)) |
5 >> 1 Das Ergebnis ist2 |
3.1 Arithmetische Operatoren
a
Hinweis: Wenn Sie in der Shell die Additionsoperation von Variablen und ausführen möchten b
, müssen Sie dazu eine bestimmte Syntax verwenden. Die direkte Eingabe $a+$b
wird von der Shell nicht als Additionsoperation interpretiert, da sie von der Shell als nicht gefundener Befehl behandelt wird.
Um Additionsoperationen auszuführen, können Sie expr
Befehle oder $((...))
Ausdrücke verwenden. Hier sind Beispiele für beide Methoden:
-
Methode 1:
expr
Befehl verwendena=1 b=2 result=$(expr $a + $b) echo "a + b = $result"
-
Methode 2:
$((...))
Ausdrücke verwendena=1 b=2 result=$((a + b)) echo "a + b = $result"
Wird zur Durchführung mathematischer Operationen verwendet. Die unterstützten arithmetischen Operatoren sind +
, -
, *
, /
, %
.
# 语法:result=$((expression))
a=5
b=2
# 加法
result=$((a + b)) # 结果是7
# 减法
result=$((a - b)) # 结果是3
# 乘法
result=$((a * b)) # 结果是10
# 除法
result=$((a / b)) # 结果是2
# 取余
result=$((a % b)) # 结果是1
3.2 Vergleichsoperatoren
Wird verwendet, um die Beziehung zwischen zwei Werten zu vergleichen. Die unterstützten Vergleichsoperatoren sind -eq
, -ne
, -gt
, -lt
, -ge
, -le
.
# 语法:[ expression ]
# 注意:方括号内的空格是必需的!
a=5
b=10
# 相等
if [ "$a" -eq "$b" ]; then
echo "$a 等于 $b"
else
echo "$a 不等于 $b"
fi
# 不等于
if [ "$a" -ne "$b" ]; then
echo "$a 不等于 $b"
else
echo "$a 等于 $b"
fi
# 大于
if [ "$a" -gt "$b" ]; then
echo "$a 大于 $b"
else
echo "$a 不大于 $b"
fi
# 小于
if [ "$a" -lt "$b" ]; then
echo "$a 小于 $b"
else
echo "$a 不小于 $b"
fi
# 大于等于
if [ "$a" -ge "$b" ]; then
echo "$a 大于等于 $b"
else
echo "$a 小于 $b"
fi
# 小于等于
if [ "$a" -le "$b" ]; then
echo "$a 小于等于 $b"
else
echo "$a 大于 $b"
fi
3.3 Logische Operatoren
Wird zur Durchführung logischer Operationen verwendet. Die unterstützten logischen Operatoren sind &&
(logisches UND), ||
(logisches ODER), !
(logisches NICHT).
# 语法:command1 && command2
# command2 仅在 command1 返回真(退出状态码为0)时执行
# 与运算
if [ "$a" -gt 0 ] && [ "$a" -lt 10 ]; then
echo "$a 大于0并且小于10"
else
echo "$a 不满足条件"
fi
# 或运算
if [ "$a" -eq 0 ] || [ "$a" -eq 10 ]; then
echo "$a 等于0或等于10"
else
echo "$a 不满足条件"
fi
# 非运算
if ! [ "$a" -eq 5 ]; then
echo "$a 不等于5"
else
echo "$a 等于5"
fi
3.4 Zuweisungsoperator
Wird verwendet, um Variablen Werte zuzuweisen. Die unterstützten Zuweisungsoperatoren sind =``+=
, -=
, *=
, /=
, %=
.
# 语法:variable operator expression
x=10
y=20
# 赋值
x=5
y=10
# 加法并赋值
x=$((x + 5)) # x 现在等于10
# 减法并赋值
y=$((y - 5)) # y 现在等于15
3,5-Bit-Operatoren
Wird zur Durchführung von Bitoperationen verwendet. Die unterstützten Bitoperatoren sind &
(bitweises UND), |
(bitweises ODER), ^
(bitweises exklusives ODER), (bitweise ~
Negation), <<
(Linksverschiebung), >>
(Rechtsverschiebung).
# 语法:result=$((expression))
a=5
b=3
# 按位与
result=$((a & b)) # 结果是1
# 按位或
result=$((a | b)) # 结果是7
# 按位异或
result=$((a ^ b)) # 结果是6
# 按位取反
result=$((~a)) # 结果是-6
# 左移
result=$((a << 2)) # 结果是20
# 右移
result=$((a >> 1)) # 结果是2
4. Prozesskontrolle
Zu den Prozesskontrollstrukturen in Shell-Skripten gehören bedingte Anweisungen (if-Anweisungen), Schleifenanweisungen (for-Schleife, while-Schleife), case-Anweisungen usw. Im Folgenden finden Sie detaillierte Syntax- und Verwendungsbeispiele für jede Flusskontrollstruktur:
4.1 Bedingte Anweisung – if-Anweisung
-
if
Anweisungen werden verwendet, um verschiedene Befehle unter bestimmten Bedingungen auszuführen. Die Syntax lautet wie folgt:if [ condition ]; then # 条件为真时执行的命令 else # 条件为假时执行的命令 fi
-
Beispiel:
#!/bin/bash x=10 if [ $x -eq 10 ]; then echo "x 等于 10" else echo "x 不等于 10" fi
4.2 Schleifenanweisung – for-Schleife
-
for
Schleifen werden verwendet, um eine Reihe von Befehlen über die Elemente in einer Liste auszuführen. Die Syntax lautet wie folgt:for variable in list; do # 在每次迭代中执行的命令 done
-
Beispiel:
#!/bin/bash fruits=("apple" "banana" "cherry") for fruit in "${fruits[@]}"; do echo "水果:$fruit" done
4.3 Schleifenanweisung – while-Schleife
-
while
Eine Schleife wird verwendet, um eine Folge von Befehlen auszuführen, wenn eine Bedingung wahr ist, bis die Bedingung falsch ist. Die Syntax lautet wie folgt:while [ condition ]; do # 当条件为真时执行的命令 done
-
Beispiel:
#!/bin/bash count=1 while [ $count -le 5 ]; do echo "循环次数:$count" ((count++)) done
4.4 Fallerklärung
-
case
Anweisungen werden verwendet, um verschiedene Befehle basierend auf unterschiedlichen Bedingungen auszuführen. Die Syntax lautet wie folgt:case expression in pattern1) # 匹配 pattern1 时执行的命令 ;; pattern2) # 匹配 pattern2 时执行的命令 ;; *) # 默认情况下执行的命令 ;; esac
-
Beispiel:
#!/bin/bash fruit="apple" case $fruit in "apple") echo "这是苹果" ;; "banana") echo "这是香蕉" ;; *) echo "这不是苹果或香蕉" ;; esac
4.5 Kontrollfluss – unterbrechen und fortfahren
-
break
Wird verwendet, um die Schleife zu verlassen. -
continue
Wird verwendet, um den Rest der aktuellen Schleife zu überspringen und mit der nächsten Iteration fortzufahren. -
Beispiel:
#!/bin/bash for i in { 1..5}; do if [ $i -eq 3 ]; then continue fi echo "循环次数:$i" if [ $i -eq 4 ]; then break fi done
5. Funktion
Shell-Funktionen sind leistungsstarke Werkzeuge, die es ermöglichen, eine Reihe von Befehlen und Logik in einer wiederverwendbaren Einheit zu kapseln, um eine bestimmte Aufgabe oder Berechnung auszuführen. In diesem Artikel befassen wir uns ausführlich mit der Syntax von Shell-Funktionen und stellen mehrere praktische Beispiele bereit, um sie besser zu verstehen und zu verwenden.
5.1 Shell-Funktionsdefinition
Shell-Funktionen können zwei verschiedene Syntaxformen verwenden: die Verwendung von function
Schlüsselwörtern und die Verwendung einer kompakten Form.
5.1.1 Funktionsdefinition des Schlüsselworts
function function_name {
# 函数体,包括命令和逻辑
# 可以接受参数
# 可以使用局部变量
# 可以返回一个值
}
5.1.2 Kompaktform-Funktionsdefinition
function_name() {
# 函数体
}
5.2 Funktionsaufruf
Sobald eine Funktion definiert ist, kann sie überall im Skript aufgerufen werden. Wenn Sie eine Funktion aufrufen, verwenden Sie einfach ihren Namen gefolgt von den erforderlichen Argumenten
Grammatik:
function_name argument1 argument2
Beispiel für einen einfachen Funktionsaufruf
# 定义一个函数,用于打印欢迎消息
welcome() {
echo "欢迎来到Shell函数示例!"
}
# 调用函数
welcome
5.3 Funktionsparameter
Funktionen können Parameter akzeptieren, was sie vielseitiger und flexibler macht. $1
Innerhalb der Funktion können Sie Variablen wie , usw. verwenden, $2
um auf die an die Funktion übergebenen Parameter zu verweisen. $3
Diese Variablen stellen den ersten Parameter, den zweiten Parameter, den dritten Parameter usw. dar.
Schauen wir uns ein Beispiel einer Funktion an, die Parameter akzeptiert:
# 定义一个函数,接受两个参数并打印它们
print_arguments() {
echo "第一个参数: $1"
echo "第二个参数: $2"
}
# 调用函数,并传递两个参数
print_arguments "Hello" "World"
print(){
echo "你的名字:$1"
echo "你的爱好:$2"
}
print "蔡徐坤" "打篮球"
5.4 Rückgabewert der Funktion
Shell-Funktionen können einen Wert zurückgeben, der es der Funktion ermöglicht, Berechnungen durchzuführen und die Ergebnisse an das Hauptprogramm zurückzugeben. Um einen Wert zurückzugeben, können Sie eine Anweisung verwenden return
und diese dann im Hauptprogramm verwenden, $?
um den Rückgabewert abzurufen.
Beispiel einer Funktion, die die Summe zweier Zahlen berechnet und das Ergebnis zurückgibt:
# 定义一个函数,计算两个数字之和并返回结果
add_numbers() {
local sum=$(( $1 + $2 ))
return $sum
}
# 调用函数,并获取返回值
add_numbers 5 7
result=$?
echo "5 + 7 的和是:$result"
5.5 Lokale Variablen
In Shell-Funktionen können Sie local
Schlüsselwörter verwenden, um lokale Variablen zu erstellen. Lokale Variablen sind nur innerhalb der Funktion sichtbar und haben keinen Einfluss auf Variablen im globalen Bereich. Dies ist sehr nützlich, da es die Verwendung von Variablen innerhalb einer Funktion ermöglicht, ohne sich Gedanken über Konflikte mit anderen Teilen des Codes machen zu müssen.
Funktionsbeispiel lokaler Variablen:
# 定义一个函数,演示局部变量
my_function() {
local local_variable="局部变量"
echo "在函数内部:$local_variable"
}
local_variable="全局变量"
my_function
echo "在函数外部:$local_variable"
fun(){
echo "全局变量值:$var"
local var="局部变量"
echo "局部变量赋值后:$var"
}
var="全局变量"
fun
5.6 Praxisbeispiele
5.6.1 Fakultät berechnen
Berechnet die Fakultät einer bestimmten Zahl. Die Fakultät ist das Produkt einer positiven ganzen Zahl und des Produkts aller positiven ganzen Zahlen von 1 bis zu dieser ganzen Zahl.
# 定义一个函数,计算给定数字的阶乘
calculate_factorial() {
local number=$1
local result=1
if [ $number -lt 0 ]; then
echo "输入必须是非负整数。"
return 1
fi
for (( i=1; i<=number; i++ )); do
result=$((result * i))
done
echo "$number 的阶乘是:$result"
return 0
}
# 调用函数,计算阶乘
calculate_factorial 5
calculate_factorial 0
calculate_factorial -3
5.6.2 Dateien suchen
Sucht eine bestimmte Datei im Dateisystem und gibt den Pfad zu der Datei zurück
# 定义一个函数,查找文件并返回路径
find_file() {
# 接受两个参数:文件名和搜索目录
local file_name=$1
local search_dir=$2
# 检查是否提供了有效的文件名和搜索目录
if [ -z "$file_name" ] || [ -z "$search_dir" ]; then
echo "请输入文件名和搜索目录。"
return 1 # 返回错误代码1表示参数不足或无效
fi
# 使用`find`命令在指定目录中查找文件
local result=$(find "$search_dir" -name "$file_name")
# 检查是否找到文件
if [ -z "$result" ]; then
echo "未找到文件 '$file_name'。"
return 1 # 返回错误代码1表示未找到文件
else
echo "文件 '$file_name' 的路径是:$result"
return 0 # 返回成功代码0表示找到文件
fi
}
# 调用函数,查找文件
find_file "example.txt" "/path/to/search" # 查找存在的文件
find_file "missing.txt" "/path/to/search" # 查找不存在的文件
find_file "" "/path/to/search" # 无效的参数:文件名为空
6. Befehle zum Abfangen, Ersetzen und Verarbeiten von Zeichen
6.1 Allgemeine Zeichenverarbeitung
6.1.1 Stringlänge
Grammatik:
${
#string}
Beispiel:
string="Hello, World!"
length=${
#string}
echo "字符串的长度为:$length" # 输出 "字符串的长度为:13"
6.1.2 Teilzeichenfolgen abfangen
Grammatik:
${string:起始位置:长度}
Beispiel:
string="Hello, World!"
substring="${string:0:5}" # 从位置0开始截取5个字符
echo "$substring" # 输出 "Hello"
6.1.3 Präfix löschen
Grammatik:
${string#前缀}
Beispiel:
string="/path/to/file.txt"
without_prefix="${string#/path/}" # 删除前缀 "/path/"
echo "$without_prefix" # 输出 "to/file.txt"
6.1.4 Suffix löschen
Grammatik:
${string%后缀}
Beispiel:
string="/path/to/file.txt"
without_suffix="${string%.txt}" # 删除后缀 ".txt"
echo "$without_suffix" # 输出 "/path/to/file"
6.1.5 In Kleinbuchstaben umwandeln
Grammatik:
${string,,}
Beispiel:
string="Hello, World!"
lowercase="${string,,}" # 转换为小写
echo "小写: $lowercase" # 输出 "小写: hello, world!"
6.1.6 In Großbuchstaben umwandeln
Grammatik:
${string^^}
Beispiel:
string="Hello, World!"
uppercase="${string^^}" # 转换为大写
echo "大写: $uppercase" # 输出 "大写: HELLO, WORLD!"
6.1.7 String-Ersetzung (erste Übereinstimmung)
Grammatik:
${string/要替换的子串/替换为的字符串}
Beispiel:
string="姓名:name,age:20,height:159cm,艺名:name"
replaced="${string/name/cxk}" # 替换第一个 "name" 为 "cxk"
echo "$replaced" # 输出 "姓名:cxk,age:20,height:159cm,艺名:name"
6.1.8 String-Ersetzung (alles abgleichen)
Grammatik:
${string//要替换的子串/替换为的字符串}
Beispiel:
string="姓名:name,age:20,height:159cm,艺名:name"
replaced="${string//name/cxk}" # 替换所有的 "apples" 为 "bananas"
echo "$replaced" # 输出 "I love bananas, bananas are great!"
6.1.9 Teilstring-Übereinstimmung extrahieren
Grammatik:
[[ $string =~ 正则表达式 ]]
匹配结果:${
BASH_REMATCH[n]}
Beispiel:
string="我的邮箱 [email protected]"
# 使用正则表达式来匹配字符串中的邮箱地址,并将匹配结果存储在`BASH_REMATCH`数组中,然后提取出匹配的邮箱地
if [[ $string =~ [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{
2,4} ]]; then
email="${
BASH_REMATCH[0]}"
echo "匹配到的邮箱地址是:$email"
fi
6.2 Reguläre Ausdrücke und Platzhalter
6.2.1 Der Unterschied zwischen regulären Ausdrücken und Platzhaltern
-
Reguläre Ausdrücke :
- Reguläre Ausdrücke sind ein leistungsstarkes
模式匹配
Werkzeug zum Abgleichen von Zeichenfolgen in Texten anhand von Mustern. Es handelt sich um eine Include-Übereinstimmung, sodass eine Übereinstimmung mit einer beliebigen Stelle in der Zeichenfolge möglich ist. - Unter Linux unterstützen Befehle wie
grep
,awk
usw.sed
normalerweise reguläre Ausdrücke. Sie können reguläre Ausdrücke zum Suchen, Ersetzen, Filtern von Text usw. verwenden. - Die umfangreiche Syntax regulärer Ausdrücke ermöglicht Ihnen die Durchführung erweiterter Textoperationen wie Erfassen, Gruppieren, Wiederholungsabgleich usw.
Beispiel:
- Verwenden Sie diese Option
grep
, um alle Zeilen zu finden, die Zahlen enthalten:grep '[0-9]' file.txt
- Reguläre Ausdrücke sind ein leistungsstarkes
-
Platzhalter :
- Platzhalter werden verwendet, um Dateinamen abzugleichen. Es handelt sich um eine exakte Übereinstimmung, die unabhängig vom Dateiinhalt nur Dateinamen findet, die einem bestimmten Muster entsprechen.
- Unter Linux unterstützen Befehle wie
ls
,find
usw.cp
normalerweise Platzhalter. Platzhalterzeichen werden zum Suchen oder Bearbeiten von Dateien verwendet, nicht für den Text in den Dateien. - Zu den Platzhalterzeichen gehören
*
(übereinstimmend mit null oder mehr Zeichen),?
(übereinstimmend mit einem Zeichen),[...]
(übereinstimmend mit einer Reihe von Zeichen) usw.
Beispiel:
- Verwenden Sie diese Option, um
ls
alle.txt
Dateien aufzulisten, die mit Folgendem enden:ls *.txt
Zusammenfassen:
- Reguläre Ausdrücke werden für die Textverarbeitung verwendet und unterstützen erweiterte Zuordnungen und Operationen.
- Platzhalter werden für den Dateinamenabgleich verwendet und sind ein grundlegendes Werkzeug zur Dateiauswahl.
6.2.2 Häufig verwendete reguläre Ausdrücke
Muster für reguläre Ausdrücke | beschreiben | Anwendungsbeispiel |
---|---|---|
^pattern |
Entspricht pattern Zeilen, die mit beginnen. |
grep '^Error' file.txt Ordnen Sie Zeilen zu, die mit „Error“ beginnen. |
pattern$ |
Entspricht pattern Zeilen, die mit enden. |
grep 'end$' file.txt Entspricht Zeilen, die mit „end“ enden. |
. |
Entspricht jedem einzelnen Zeichen außer Newline. | grep 'a.b' file.txt Entspricht „aab“, „axb“ usw. |
* |
Entspricht null oder mehr Instanzen des vorherigen Zeichens oder Unterausdrucks. | grep 'go*gle' file.txt Entspricht „ggle“, „google“, „gooogle“ usw. |
+ |
Entspricht einer oder mehreren Instanzen des vorherigen Zeichens oder Unterausdrucks. | grep 'go+gle' file.txt Entspricht „google“, „gooogle“ usw., aber nicht „ggle“. |
? |
Entspricht null oder einer Instanz des vorherigen Zeichens oder Unterausdrucks. | grep 'colou?r' file.txt Entspricht „Farbe“ und „Farbe“. |
[abc] |
Entspricht jedem Zeichen im Zeichensatz. | grep '[aeiou]' file.txt Entspricht Zeilen, die Vokale enthalten. |
[0-9] |
Entspricht einer beliebigen Zahl. | grep '[0-9]' file.txt Entspricht Zeilen, die Zahlen enthalten. |
[^abc] |
Entspricht jedem Zeichen, das nicht im Zeichensatz enthalten ist. | grep '[^0-9]' file.txt Entspricht Zeilen, die keine Zahlen enthalten. |
\d |
Entspricht jedem numerischen Zeichen, äquivalent zu [0-9] . |
grep '\d' file.txt Entspricht Zeilen, die Zahlen enthalten. |
\D |
Entspricht jedem nicht numerischen Zeichen, äquivalent zu [^0-9] . |
grep '\D' file.txt Entspricht Zeilen, die keine Zahlen enthalten. |
\w |
Entspricht jedem einzelnen Wortzeichen (Buchstabe, Zahl oder Unterstrich), äquivalent zu [a-zA-Z0-9_] . |
grep '\w' file.txt Entspricht Zeilen, die Wortzeichen enthalten. |
\W |
Entspricht jedem Nicht-Wort-Zeichen, äquivalent zu [^a-zA-Z0-9_] . |
grep '\W' file.txt Entspricht Zeilen, die keine Wortzeichen enthalten. |
\s |
Entspricht jedem Leerzeichen (Leerzeichen, Tabulator, Zeilenumbruch usw.). | grep '\s' file.txt Entspricht Zeilen, die Leerzeichen enthalten. |
\S |
Entspricht jedem Zeichen, das kein Leerzeichen ist. | grep '\S' file.txt Entspricht Zeilen, die keine Leerzeichen enthalten. |
(pattern) |
Erstellen Sie eine Erfassungsgruppe, die passenden Text erfasst. | grep 'a\(bc\)*d' file.txt Entspricht „ad“, „abcd“, „abcbcd“ usw. |
` | ` | Logischer ODER-Operator, entspricht einem von zwei Mustern. |
.* |
Entspricht null oder mehr beliebigen Zeichen, normalerweise einer ganzen Textzeile. | grep '.*pattern.*' file.txt Entspricht Zeilen, die „Muster“ enthalten. |
6.3 Befehle zum Abfangen, Ersetzen und Verarbeiten von Zeichen
6.3.1 Schnittbefehl
cut
命令用于从文本行中剪切或提取字段。默认情况下,cut
使用制表符(Tab)
作为字段分隔符,但可以通过-d
选项指定其他分隔符。它通常用于提取或删除文本文件中的特定列。
基本用法:
cut [OPTIONS] [FILE]
-
剪切文件中的第2列:
cut -f2 input.txt
-
使用逗号作为分隔符剪切第1和第3列:
cut -d',' -f1,3 input.csv
-
以特定字符作为字段分隔符,剪切第1列:
cut -d',' -f1 /etc/passwd
-
剪切每行的前5个字符:
cut -c1-5 input.txt
6.3.2 awk命令
awk
是一个强大的文本处理工具,它可以执行复杂的文本处理操作,包括文本提取、计算、条件筛选等。awk
将文本分割成字段,并允许对字段进行操作。它的灵活性使其成为处理结构化文本数据的理想工具。
基本用法:
awk 'pattern { action }' [FILE]
-
显示文件的第2列和第3列:
awk '{print $2, $3}' input.txt
-
计算文件中所有数字的总和:
awk '{ sum += $1 } END { print sum }' input.txt
-
使用逗号作为分隔符,打印第1列和第3列:
awk -F',' '{print $1, $3}' input.csv
-
打印包含特定模式的行:
awk '/pattern/ {print}' input.txt
6.3.3 sed命令
sed
(流编辑器)用于对文本进行基本的编辑和转换,如替换、删除、插入和替换。sed
可以通过正则表达式来匹配和操作文本,通常在管道中与其他命令一起使用。
基本用法:
sed [OPTIONS] 's/pattern/replacement/' [FILE]
-
替换文本文件中的所有"old"为"new":
sed 's/old/new/g' input.txt
-
删除包含特定字符串的行:
sed '/pattern/d' input.txt
-
在每行的开头插入文本:
sed 's/^/Prefix /' input.txt
-
将文件中的所有字母转换为大写:
sed 's/[a-z]/\U&/g' input.txt
6.4 sort、uniq、wc 命令
sort
、uniq
和wc
是在Linux和Unix系统上常用的命令,用于排序、去重和统计文本数据。
6.4.1 sort命令
sort
命令用于对文本文件的行进行排序。默认情况下,它按照字典顺序对文本行进行排序,但可以使用不同的选项来进行数字排序、逆序排序等。
基本用法:
sort [OPTIONS] [FILE]
-
对文件进行排序并将结果输出到标准输出:
sort input.txt
-
对文件进行数字排序(例如,按数值大小而不是字典顺序):
sort -n input.txt
-
对文件进行逆序排序:
sort -r input.txt
6.4.2 uniq命令
uniq
命令用于从已排序的文本数据中去重重复的行。它通常与sort
命令结合使用,以确保重复行相邻。
基本用法:
uniq [OPTIONS] [FILE]
-
从文件中去重重复的行:
sort input.txt | uniq
-
显示去重后的行以及它们重复的次数:
sort input.txt | uniq -c
6.4.3 wc命令
wc
命令用于统计文本文件的行数、字数和字符数。
基本用法:
wc [OPTIONS] [FILE]
-
统计文件的行数、单词数和字符数:
wc input.txt
-
仅统计行数:
wc -l input.txt
-
仅统计单词数:
wc -w input.txt
-
仅统计字符数:
wc -c input.txt
6.5 管道(Pipeline)
管道(Pipeline)是在Unix和类Unix操作系统中广泛使用的强大工具,它允许将一个命令的输出直接传递给另一个命令,以便进行复杂的数据处理和筛选。
管道(Pipeline)语法:
command1 | command2
command1
:第一个命令的输出将被传递给第二个命令。command2
:接收来自command1
的输入并进行处理的第二个命令。
6.6 grep命令
grep命令用于在文本中搜索匹配指定模式的行
grep命令语法:
grep [选项] 模式 [文件...]
选项
:可以是一些可选的标志,用于控制搜索的行为。模式
:要搜索的文本模式或正则表达式。文件
:要在其中搜索模式的一个或多个文件。如果省略文件参数,则grep将从标准输入中读取数据。
- 搜索文件中包含特定字符串的行:
grep "search_term" filename.txt
- 搜索多个文件中包含特定字符串的行:
grep "search_term" file1.txt file2.txt
- 搜索目录中所有文件包含特定字符串的行:
grep "search_term" /path/to/directory/*
- 搜索多个文件并显示匹配行的行号:
grep -n "search_term" file1.txt file2.txt
- 忽略大小写进行搜索:
grep -i "search_term" filename.txt
- 使用正则表达式进行高级搜索(例如,查找以"abc"开头的行):
grep "^abc" filename.txt
- 逆向搜索,即只显示不匹配模式的行:
grep -v "search_term" filename.txt
- 递归搜索目录中的文件:
grep -r "search_term" /path/to/directory/
- 搜索匹配模式的行并统计匹配的次数:
grep -c "search_term" filename.txt
7. 输入输出重定向
7.1 Linux标准输入
类型 | 设备 | 设备名 | 文件描述符 | 类型 |
---|---|---|---|---|
标准输入(stdin) | 键盘 | /dev/stdin | 0 | 标准输入 |
标准输出(stdout) | 显示器 | /dev/stdout | 1 | 标准输出 |
标准错误输出(stderr) | 显示器 | /dev/stderr | 2 | 标准错误输出 |
7.2 输入重定向
类型 | 符号(语法) | 功能 |
---|---|---|
标准输入 | 命令 < 文件1 | 命令将文件1的内容作为标准输入设备 |
标识符限定输入 | 命令 << 标识符 | 命令将标准输入中读入内容,直到遇到“标识符”分隔符为止 |
输入输出重定向 | 命令 < 文件1 > 文件2 | 命令将文件1的内容作为标准输入,将文件2作为标准输出。 |
7.3 输出重定向
类型 | 符号 | 作用 |
---|---|---|
Standardausgabeumleitung (Override) | Befehl > Datei | Geben Sie im Überschreibmodus den korrekten Ausgabeinhalt des Befehls in die angegebene Datei oder das angegebene Gerät aus |
Standardausgabeumleitung (anhängen) | Befehl>>Datei | Geben Sie im Anhängemodus den korrekten Ausgabeinhalt des Befehls in die angegebene Datei oder das angegebene Gerät aus |
Standardfehlerausgabeumleitung (Override) | Fehlerbefehl 2 > Datei | Gibt die Fehlerausgabe des Befehls im Überschreibmodus an die angegebene Datei oder das angegebene Gerät aus |
Standardfehlerausgabeumleitung (anhängen) | Fehler Befehl 2>> Datei | Geben Sie im Anhängemodus die Fehlerausgabe des Befehls in die angegebene Datei oder das angegebene Gerät aus |
Speichern Sie sowohl stdout als auch stderr (überschreiben) | Befehl>Datei2>&1 | Speichern Sie im Overlay-Modus sowohl die korrekte als auch die fehlerhafte Ausgabe in derselben Datei |
Sowohl die Standardausgabe als auch die Standardfehlerausgabe speichern (anhängen) | Befehl>>Datei2>&1 | Speichern Sie im Anhängemodus sowohl die korrekte Ausgabe als auch die Fehlerausgabe in derselben Datei |
Speichern Sie sowohl stdout als auch stderr (überschreiben) | Befehl&>Datei | Speichern Sie im Overlay-Modus sowohl die korrekte als auch die fehlerhafte Ausgabe in derselben Datei |
Sowohl die Standardausgabe als auch die Standardfehlerausgabe speichern (anhängen) | Befehl &>> Datei | Speichern Sie im Anhängemodus sowohl die korrekte Ausgabe als auch die Fehlerausgabe in derselben Datei |
Korrekte Ausgabe und Fehlerausgabe getrennt speichern | Befehl > Datei 1 2 > Datei 2 | Speichern Sie die korrekte Ausgabe in Datei 1 und die Fehlerausgabe in Datei 2 |
7.4 /dev/null
Wenn Sie einen Befehl ausführen möchten, ohne die Ausgabe auf dem Bildschirm anzuzeigen, können Sie /dev/null
die Ausgabe vollständig verwerfen, indem Sie sie in eine Datei umleiten.
Beispiel:
command > /dev/null
Dieser Befehl leitet die Standardausgabe des Befehls in /dev/null
eine Datei um und verwirft die Ausgabe vollständig.