Detaillierte Erläuterung der Syntax zum Schreiben von Shell-Skripten

1 Grundlegende Grammatik

1.1 Variablen

Variablen: Verwenden Sie eine Zeichenfolge fester Zeichen, um ein variables Ziel darzustellen.

1.1.1 Variablentyp

In der Shell gibt es gleichzeitig drei Arten von Variablen.

  • Lokale Variablen: Lokale Variablen werden in Skripten oder Befehlen definiert und sind nur in der aktuellen Shell-Instanz gültig. Programme, die von anderen Shells gestartet werden, können nicht auf lokale Variablen zugreifen.

  • Umgebungsvariablen: Alle Programme, einschließlich der von der Shell gestarteten Programme, können auf Umgebungsvariablen zugreifen, und einige Programme benötigen Umgebungsvariablen, um ihren normalen Betrieb sicherzustellen.

    Shell-Skripte können bei Bedarf auch Umgebungsvariablen definieren.

  • Shell-Variablen: Shell-Variablen sind spezielle Variablen, die von Shell-Programmen festgelegt werden.

    Einige der Shell-Variablen sind Umgebungsvariablen und andere sind lokale Variablen, die den normalen Betrieb der Shell sicherstellen

1.1.2 Variablenbetrieb

  1. Erstellen Sie gewöhnliche Variablen: name = "test",Hinweis: Auf beiden Seiten des Gleichheitszeichens dürfen keine Leerzeichen stehen
  2. Erstellen Sie eine lokale Variable: lokaler Name = „test“,Auf geänderte localVariablen kann außerhalb des Funktionskörpers nicht zugegriffen werden und sie können nur im Funktionskörper verwendet werden
  3. Erstellen Sie eine schreibgeschützte Variable: name="only_read" -> schreibgeschützter Name,Diese Variable kann nicht geändert werden
  4. Verwenden Sie Variablen: echo $name oder echo ${name}
  5. Variable löschen: Name nicht festgelegt, auf die Variable kann nach dem Löschen nicht zugegriffen werden.Hinweis: Nur-Lese-Variablen können nicht gelöscht werden

1.1.3 String-Variablen

1.1.3.1 Erstellung von String-Variablen

  1. Erstellt mit einfachen Anführungszeichen: var='test'

    Die auf diese Weise erstellte Variable kann nur so ausgegeben werden, wie sie ist, und die Variable ist ungültig. Wir können die Definition von „String-Konstante“ in C ausleihen, um diese Funktion zu verstehen.

    Darüber hinaus dürfen in einfachen Anführungszeichen keine einfachen Anführungszeichen verwendet werden, und Escapezeichen sind ebenfalls nicht zulässig.

  2. Erstellt mit doppelten Anführungszeichen: var="mein Name ist ${name}"

    Auf diese Weise erstellte String-Variablen sind gültig, es können auch Escape-Zeichen vorkommen.

1.1.3.2 Strings verketten

  1. Literales Spleißen
    von str="1""2" oder str01="1"'2', sodass die beiden Zeichen 1 und 2 miteinander verbunden werden. Es ist zu beachten, dass zwischen den beiden Zeichenfolgen keine Leerzeichen stehen dürfen.

  2. Variablenspleißen: Mit den folgenden drei Methoden können Zeichenfolgenvariablen gespleißt werden.

    • str=${part01}${part02}
    • str02=${part01}“end“
    • str03=“${part01} ${part02}“
  3. Befehlsspleißen: Datum ist hier ein Shell-Befehl, der in Anführungszeichen gesetzt werden muss
    str = Datum „Ende“

    str02=`date`"end"
    

1.1.3.3 Ermitteln Sie die Zeichenfolgenlänge

  1. wc -LBefehl verwenden

wc -LDie Länge der aktuellen Zeile kann ermittelt werden, sodass mit dieser einfachen Methode die Zeichenfolge einer einzelnen Zeile ermittelt und die wc -lAnzahl der Zeilen des Inhalts der aktuellen Zeichenfolge ermittelt werden kann.

echo "abc" |wc -L
  1. expr lengthDie Länge der Zeichenfolge kann mit ermittelt werden
expr length ${<!--{C}%3C!%2D%2D%20%2D%2D%3E-->str}
  1. Awk ermittelt die Anzahl der Domänen

Wenn jedoch bei einer Länge von mehr als 10 Zeichen ein Problem auftritt, muss dies später bestätigt werden

echo "abc" |awk -F "" '{print NF}'
  1. awk+lengthErmitteln Sie die Zeichenfolgenlänge um
echo "Alex"|awk '{print length($0)}'
  1. echo ${#name}Art des Vorbeigehens
echo "Alex"|awk '{print length($0)}'

1.1.3.4 Teilzeichenfolge extrahieren

der Code Bedeutung
${variable##*string} Fangen Sie die Zeichenfolge nach der letzten Zeichenfolge von links nach rechts ab
${variable#*string} Fangen Sie die Zeichenfolge nach der ersten Zeichenfolge von links nach rechts ab
${variable%%string*} Fangen Sie die Zeichenfolge nach der letzten Zeichenfolge von rechts nach links ab
${variable%string*} Fangen Sie die Zeichenfolge nach der ersten Zeichenfolge von rechts nach links ab
$ var=firenation.jpg
$ echo ${var##*i}

Das Ergebnis der Operation iston.jpg

2. verwenden${varible:n1:n2}

Fangen Sie die Zeichenfolge der Variablenvariable von n1 bis n2 ab und wählen Sie eine bestimmte Teilzeichenfolge entsprechend einem bestimmten Zeichenversatz und einer bestimmten Länge aus, wie im folgenden Code gezeigt:

$ var=azula
$ echo ${var:0:3}

Abschließend werden die Laufergebnisse angezeigt azu.

1.1.4 Arrays

Ein Array ist eine Sammlung von Variablen, die mehrere Elemente in einem zusammenhängenden Speicherbereich speichern.

In Bash werden nur eindimensionale Arrays unterstützt, mehrdimensionale Arrays werden nicht unterstützt.

1.1.4.1 Array-Definition und Referenz

Ein Array ist wie folgt definiert:

数组名=(元素1 元素2 元素1 ... 元素n)

Weisen Sie den Elementen des angegebenen Arrays Werte zu, die dem Index entsprechen:

数组名[下标]=

Geben Sie mehrere Array-Elemente gleichzeitig für die Zuweisung an:

数组名=([下标1]=值1 [下标2]=值2 ... [下标n]=值n)

So referenzieren Sie ein Element eines Arrays, das einem Index entspricht:

${数组名[下标]}

1.1.4.2 Array-Elemente durchlaufen

Verwenden Sie for(oder whileSchleife), um Array-Elemente zu durchlaufen:

#!/bin/bash
a=(1 2 3 4 5 6)
for((i=0; i<10; i++))
do
    echo "a[$i]=${a[$i]}"
done

Darüber hinaus können wir auch ${a[*]}oder verwenden ${a[@]}, um Array-Elemente zu durchlaufen. Der spezifische Code lautet wie folgt:

#!/bin/bash
a=(1 2 3 4 5 6)
echo ${a[*]}
echo ${a[@]}

1.1.4.3 Ermitteln Sie die Länge des Arrays

Wir können verwenden #, um die Länge des Arrays zu ermitteln. Es ist zu beachten, dass im Shell-Skript kein Fehler gemeldet wird, wenn wir außerhalb der Grenzen auf das Array zugreifen.

#!/bin/bash
a=(1 2 3 4 5 6)
echo ${a[*]}
echo "a len: ${
     
     #a[*]}"

Wir verwenden es zunächst, um die Elemente im Array abzurufen, und verwenden es dann, #um die Anzahl der Elemente abzurufen.

1.1.4.4 Arrays zusammenführen

Wir können wie folgt spleißen:

#!/bin/bash
a=(1 2 3 4 5 6)
b=("hello" "zhaixue.cc")
c=(${a[*]} ${b[*]})

Auf diese Weise verketten wir die beiden Arrays miteinander.

1.1.4.5 Array-Elemente löschen

Wenn wir ein Array-Element löschen möchten, lautet der spezifische Code wie folgt:

#!/bin/bash
a=(1 2 3 4 5 6)
echo ${a[*]}
echo "a len: ${
     
     #a[*]}"
unset a[5]
echo ${a[*]}
echo "a len: ${
     
     #a[*]}"

Wenn wir das gesamte Array löschen möchten, können wir es ausführen unset a. Der Beispielcode lautet wie folgt:

#!/bin/bash
a=(1 2 3 4 5 6)
echo ${a[*]}
echo "a len: ${
     
     #a[*]}"
unset a
echo ${a[*]}
echo "a len: ${
     
     #a[*]}"

1.1.3 Übergabe variabler Parameter

Die relevanten Variablenbedeutungen sind:

Variable Bedeutung
0 $ Der Name der auszuführenden Datei
1 $ Stellt den ersten übergebenen Parameter dar
$n Stellt den n-ten übergebenen Parameter dar
$# Anzahl der Parameter
$* Zeigt alle an das Skript übergebenen Argumente als einzelne Zeichenfolge an.
$@ Wie $*, aber verwenden Sie Anführungszeichen und geben Sie jedes Argument in Anführungszeichen zurück
$$ Die aktuelle Prozessnummer, in der das Skript ausgeführt wird
$! Die ID des letzten Prozesses, der im Hintergrund ausgeführt wird
$? Zeigt den Exit-Status des letzten Befehls an. 0 bedeutet keine Fehler, jeder andere Wert weist auf Fehler hin.

1.2 Betreiber

Native Bash unterstützt keine einfachen mathematischen Operationen, die normalerweise durch andere Befehle erreicht werden.

1.2.1 Arithmetische Operatoren

aDie Summen und Summen in den folgenden Tabellen bsind Variablen.

Betrieb Format in der Shell
Zusatz expr $a + $b
Subtraktion expr $a - $b
Multiplikation expr $a \* $b
Aufteilung expr $b / $a
Nimm den Rest expr $b % $a
Abtretung a=$b
gleich [ $a == $b ]
nicht gleich [ $a != $b ]

Hinweis: Die Formel der Bedingungstabelle muss in eckige Klammern gesetzt werden und es müssen Leerzeichen vorhanden sein. verwenden

expr

Für Berechnungen müssen Backticks verwendet werden. Um den Lesern das Verständnis zu erleichtern, wird der folgende Beispielcode angegeben.

#!/bin/bash
a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

1.2.2 Vergleichsoperatoren

Vergleichsoperatoren unterstützen nur Zahlen, keine Zeichenfolgen, es sei denn, der Wert der Zeichenfolge ist eine Zahl.

Betrieb Implementierung in der Shell Hauptsymbol
Überprüft, ob zwei Zahlen gleich sind [ $a -eq $b ] -Gl
Prüft, ob zwei Zahlen ungleich sind [ $a -ne $b ] - Ist
Überprüfen Sie, ob die Zahl links größer als die Zahl rechts ist [ $a -gt $b ] -gt
Überprüfen Sie, ob die Zahl links kleiner als die Zahl rechts ist [ $a -lt $b ] -lt
Überprüfen Sie, ob die Zahl links größer oder gleich der Zahl rechts ist [ $a -ge $b ] -ge
Überprüfen Sie, ob die Zahl links kleiner oder gleich der Zahl rechts ist [ $a -und $b - Die

Der Beispielcode lautet wie folgt:

#!/bin/bash
a=1
b=2

if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a == $b: a 等于 b"

1.2.1 Boolesche Operatoren

Einzelheiten wie folgt:

Betrieb Implementierung in der Shell Hauptsymbol
nicht betrieb [ ! FALSCH ] !
ODER-Verknüpfung [ $a -lt 20 -o $b -gt 100 ]
UND-Verknüpfung [ $a -lt 20 -a $b -gt 100 ] -A

1.2.2 Logische Operatoren

Einzelheiten wie folgt:

Betrieb Implementierung in der Shell Hauptsymbol
Logisches UND [[ $a -lt 100 && $b -gt 100 ]] &&
Logisches ODER [[ $a -lt 100 `

Der Unterschied zwischen booleschen Operatoren und logischen Operatoren:

Syntaktisch erfordern logische Operationen doppelte Klammern und boolesche Operationen nur einfache geschweifte Klammern. Funktionell haben logische Operationen eine spezielle Kurzschlussfunktion, das heißt, wenn der erste Ausdruck in der UND-Verknüpfung falsch ist, wird der zweite Ausdruck nicht ausgeführt. Bei einer ODER-Operation wird der zweite Ausdruck nicht ausgeführt, wenn der erste Ausdruck wahr ist.

1.2.3 String-Operatoren

In der folgenden Tabelle sind häufig verwendete Zeichenfolgenoperatoren aufgeführt:

Betrieb Implementierung in der Shell Hauptsymbol
Überprüft, ob zwei Zeichenfolgen gleich sind [ $a = $b ] =
Überprüft, ob zwei Zeichenfolgen ungleich sind [ $a != $b ] !=
Überprüfen Sie, ob die Zeichenfolgenlänge 0 ist [ -z $a ] -z
Überprüfen Sie, ob die Zeichenfolgenlänge nicht 0 ist [ -n „$a“ ] -N
Überprüfen Sie, ob die Zeichenfolge leer ist [ $a ] $

1.2.6 Dateitestoperatoren

Wird hauptsächlich zum Erkennen verschiedener Attribute von Unix-Dateien verwendet:

Betrieb Implementierung in der Shell Hauptsymbol
Überprüfen Sie, ob eine Datei eine Blockgerätedatei ist [ -b $datei ] -b-Datei
Überprüfen Sie, ob es sich bei einer Datei um eine Zeichengerätedatei handelt [ -c $datei ] -c-Datei
Überprüfen Sie, ob eine Datei ein Verzeichnis ist [ -d $datei ] -d-Datei
Überprüfen Sie, ob eine Datei eine gewöhnliche Datei ist (weder ein Verzeichnis noch eine Gerätedatei). [ -f $file ] gibt true zurück -f-Datei
Überprüfen Sie, ob in einer Datei das SGID-Bit gesetzt ist [ -g $datei ] -g-Datei
Überprüfen Sie, ob für eine Datei ein Sticky-Bit gesetzt ist (Sticky Bit). [ -k $datei ] -k-Datei
Überprüfen Sie, ob eine Datei eine Named Pipe ist [ -p $datei ] -p file
检测文件是否设置了 SUID 位 [ -u $file ] -u file
检测文件是否可读 [ -r $file ] -r file
检测文件是否可写 [ -w $file ] -w file
检测文件是否可执行 [ -x $file ] -x file
检测文件是否为空(文件大小是否大于0) [ -s $file ] -s file
检测文件(包括目录)是否存在 [ -e $file ] -e file

举例如下:

#!/bin/bash
file="/home/westos/Desktop/textcpp/test.sh"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi

1.2.7 运算指令

1.(( ))

我们可以直接使用双圆括弧计算其中的内容,如((var=a+b))

该指令经常在if/while等条件判断中需要计算时使用。

2.let

在计算表达式的时候我们可以直接使用let

如:let var=a+b。

3.expr

在前面的内容中我们也提到了它,是非常常用的计算指令,使用时需要在外部增反引号

 var=`expr a+b`

4.bc计算器

bc计算器支持shell中的小数进行运算,并且可以交互式或者非交互式的使用。

基本使用方式为var=$(echo "(1.1+2.1)"|bc)

5.$[]

我们可以直接使用这种方式计算中括弧中的内容,如echo $[1+2]

1.3 控制语句

和其他语句不同,shell的流传呢个控制不可为空。接下来我们为大家介绍sehll中常用的语法。

1.3.1 if语句结构

1.3.1.1 if-fi

就类似于c中的if条件判断,如下:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

1.3.1.2 if-else-fi

代码如下:

if condition
then
    command1 
else
    command2
fi

若condition成立则执行command1,否则执行command2。

1.3.1.3 if else-if else

代码如下:

if condition1
then
    command1
elif condition2 
then 
    command2
else
    command3
fi

1.3.2 循环结构

1.3.2.1 for循环

格式为:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

以上也可以写做一行,若变量var在列表中,则for循环执行一次所有命令。以以下代码作为测试:

#!/bin/bash
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

1.3.2.2 while循环

格式如下:

while condition
do
    command
done

我们运行如下代码:

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

1.3.2.3 无限循环

我们可以以上两种语句给出无限循环的实现,首先看一下for循环如何实现:

for (( ; ; ))

除此以外我们也可以使用while循环实现如下:

while :
do
    command
done

或者直接将while中的判断语句置为真:

while true
do
    command
done

1.3.2.4 until循环

until 循环执行一系列命令直至条件为 true 时停止。语法格式如下:

until condition
do
    command
done

1.3.2.5 跳出循环

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:breakcontinue

1.break跳出循环

当我们需要跳出当前循环,或者终止死循环时,我们就可以使用break来跳出循环。接下来我们运行如下代码:

#!/bin/bash
var=1
while(( $var < 5 ))
do
        if(( $var>3 ))
        then
             echo "跳出循环"
             break
        fi
        echo "$var"
        var=`expr $var + 1`
done

在该循环中var>1时break,而是直接跳出循环。

2.continue跳出循环

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。 接下来我们运行如下代码:

#!/bin/bash
var=1
while(( $var < 5 ))
do
        if(( $var>3 ))
        then
             echo "跳出循环"
             continue
        fi
        echo "$var"
        var=`expr $var + 1`
done

使用continue跳出的循环只是当前循环,无法跳出整个循环,由于在该代码中我们每次执行到continue就会跳出当前循环,无法执行 var=expr $var + 1,所以循环条件一直成立,就成了死循环。

1.3.3 case-esac多选择语句

  • case ... esac 为多选择语句。
  • 与其他语言中的switch ... case 语句类似,是一种多分支选择结构
    • 每个 case 分支用右圆括号开始
    • 用两个分号 ;;表示 break,跳出整个 case … esac 语句
    • esac(就是 case 反过来)作为结束标记。
  • case 要求取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
  • 若检测匹配时无一匹配,使用*捕获该值,再执行后续命令。

语法格式如下:

casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
   *)
    command1
esac

1.3.4 select-in语句

select ... in ...非常适合终端的交互场景,它可以显示出带编号的菜单,用户出入不同编号就可以选择不同的菜单,并执行不同的功能。

语法格式如下:

select var in seq
do
    action
done

我们执行如下代码:

#!/bin/bash

echo "What is your favourite OS?"
select var in "Linux" "Mac" "Win" "Other"; do
  break;
done
echo "You have selected $var"

2 函数

函数其实就是将一段代码组合封装在一起实现某个特定的功能或返回某个特定的值。我们在定义函数时需要先起一个函数名,在使用的时候直接调用函数名即可

2.1 定义函数

shell中定义函数格式如下:

[ function ] funname [()]
{
    
    
    action;
    [return int;]
}

注意:

  1. [ function ]可以省略
  2. 当函数没有return时,默认返回最后一个命令的运行结果作为返回值(有点像Scala?)

2.2 函数参数

在shell中,调用函数时可以向其传递参数。在函数内部直接通过$n获取参数的值。我们给出示例如下:

#!/bin/bash
funWithParam(){
    
    
    echo "第一个参数为 $1 !"
    echo "第十个参数为 ${10} !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

需要注意$10不能返回第十个参数,当n>10的时候,需要使用${n}来获取参数。

2.3 函数作用域

Shell脚本中执行函数时并不会开启子进程,默认在函数外部或函数内部定义和使用变量的效果相同。函数外部的变量在函数内部可以直接调用,反之函数内部的变量也可以在函数外部直接调用。

为了更好区分,系统为我们提供了local语句,该语句可以使在函数内部定义的变量仅在函数内部有效。定义时直接在变量前加local即可。

3 重定向

一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

  1. 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  2. 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  3. 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

但有些时候我们可能需要将数据从其它文件读入或读出,这就需要我们重定向。

3.1 输入重定向

我们可以让命令从文件中获取,这样本来的命令需要从标准输入stdin中获取,转换为从我们的指定文件中获取。这样本来需要从键盘输入的命令就会转移到文件读取内容。语法如下:

command1 < file

3.2 输出重定向

同输入重定向很相似,输出重定向也是将本来需要输出标准输出文件stdout中转化为我们的指定文件中。语法如下:

command1 > file

3.1 标准错误文件重定向

我们可以直接借助标准错误文件的文件描述符来重定向stderr,语法如下:

$ command 2>file

扩充一点,如果我们想将stdout标准输出文件和stderr标准错误文件合并重定向到一个指定文件中,语法如下:

$ command > file 2>&1

3.2 Here Document

Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。基本语法如下:

command << delimiter   documentdelimiter

注意:结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。开始的delimiter前后的空格会被忽略掉。

3.3 /dev/null 文件

  • 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null中,/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;
  • 如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。语法如下:
$ command > /dev/null

Ich denke du magst

Origin blog.csdn.net/twi_twi/article/details/128406613
Empfohlen
Rangfolge