Arbeiten mit Arrays in Linux Shell Scripting – Teil 8
Wir können uns eine Programmiersprache ohne das Konzept von Arrays nicht vorstellen. Es spielt keine Rolle, wie sie in verschiedenen Sprachen implementiert werden. Stattdessen helfen uns Arrays dabei, ähnliche oder unterschiedliche Daten unter einem symbolischen Namen zu konsolidieren.
Da wir uns mit Shell-Skripten beschäftigen, hilft Ihnen dieser Artikel dabei, mit einigen Shell-Skripten herumzuspielen, die dieses Array-Konzept nutzen.
Array-Initialisierung und -Nutzung
Mit neueren Versionen von Bash werden eindimensionale Arrays unterstützt. Ein Array kann explizit durch die in der Shell integrierte Funktion declare deklariert werden.
declare -a var
Es ist jedoch nicht erforderlich, Array-Variablen wie oben zu deklarieren. Wir können einzelne Elemente wie folgt direkt in ein Array einfügen.
var[XX]=<value>
wobei „XX“ den Array-Index bezeichnet. Um Array-Elemente zu dereferenzieren, verwenden Sie die Syntax mit geschweiften Klammern, d. h.
${var[XX]}
Hinweis: Die Array-Indizierung beginnt immer mit 0.
Eine weitere praktische Möglichkeit, ein gesamtes Array zu initialisieren, ist die Verwendung des Klammerpaars, wie unten gezeigt.
var=( element1 element2 element3 . . . elementN )
Es gibt noch eine weitere Möglichkeit, Arrays Werte zuzuweisen. Diese Art der Initialisierung ist eine Unterkategorie der zuvor erläuterten Methode.
array=( [XX]=<value> [XX]=<value> . . . )
Mit der integrierten read-Shell können wir auch während der Ausführungszeit Werte zum Array lesen/zuordnen.
read -a array
Wenn nun die obige Anweisung in einem Skript ausgeführt wird, wartet es auf eine Eingabe. Wir müssen die Array-Elemente durch Leerzeichen (und nicht durch Wagenrücklauf) getrennt bereitstellen. Nachdem Sie die Werte eingegeben haben, drücken Sie zum Beenden die Eingabetaste.
Um die Array-Elemente zu durchlaufen, können wir auch eine for-Schleife verwenden.
for i in “${array[@]}”
do
#access each element as $i. . .
done
Das folgende Skript fasst den Inhalt dieses speziellen Abschnitts zusammen.
#!/bin/bash
array1[0]=one
array1[1]=1
echo ${array1[0]}
echo ${array1[1]}
array2=( one two three )
echo ${array2[0]}
echo ${array2[2]}
array3=( [9]=nine [11]=11 )
echo ${array3[9]}
echo ${array3[11]}
read -a array4
for i in "${array4[@]}"
do
echo $i
done
exit 0
Verschiedene Operationen auf Arrays
Viele der Standard-String-Operationen funktionieren auf Arrays. Schauen Sie sich das folgende Beispielskript an, das einige Operationen für Arrays implementiert (einschließlich String-Operationen).
#!/bin/bash
array=( apple bat cat dog elephant frog )
#print first element
echo ${array[0]}
echo ${array:0}
#display all elements
echo ${array[@]}
echo ${array[@]:0}
#display all elements except first one
echo ${array[@]:1}
#display elements in a range
echo ${array[@]:1:4}
#length of first element
echo ${#array[0]}
echo ${#array}
#number of elements
echo ${#array[*]}
echo ${#array[@]}
#replacing substring
echo ${array[@]//a/A}
exit 0
Es folgt die Ausgabe, die bei der Ausführung des obigen Skripts erzeugt wird.
apple
apple
apple bat cat dog elephant frog
apple bat cat dog elephant frog
bat cat dog elephant frog
bat cat dog elephant
5
5
6
6
Apple bAt cAt dog elephAnt frog
Ich denke, dass es keinen Sinn macht, das obige Skript im Detail zu erklären, da es selbsterklärend ist. Bei Bedarf werde ich einen Teil dieser Serie ausschließlich den String-Manipulationen widmen.
Befehlsersetzung mit Arrays
Die Befehlsersetzung ordnet die Ausgabe eines Befehls oder mehrerer Befehle einem anderen Kontext zu. Hier können wir in diesem Kontext von Arrays die Ausgabe von Befehlen als einzelne Elemente von Arrays einfügen. Die Syntax ist wie folgt.
array=( $(command) )
Standardmäßig werden die durch Leerzeichen getrennten Inhalte in der Ausgabe des Befehls als einzelne Elemente in das Array eingefügt. Das folgende Skript listet den Inhalt eines Verzeichnisses auf, bei dem es sich um Dateien mit 755-Berechtigungen handelt.
#!/bin/bash
ERR=27
EXT=0
if [ $# -ne 1 ]; then
echo "Usage: $0 <path>"
exit $ERR
fi
if [ ! -d $1 ]; then
echo "Directory $1 doesn't exists"
exit $ERR
fi
temp=( $(find $1 -maxdepth 1 -type f) )
for i in "${temp[@]}"
do
perm=$(ls -l $i)
if [ `expr ${perm:0:10} : "-rwxr-xr-x"` -eq 10 ]; then
echo ${i##*/}
fi
done
exit $EXT
Simulation zweidimensionaler Arrays
Wir können eine zweidimensionale Matrix leicht mithilfe eines eindimensionalen Arrays darstellen. In der Zeilenhauptordnung-Darstellung werden Elemente in jeder Zeile einer Matrix nacheinander und nacheinander in Array-Indizes gespeichert. Für eine mXn-Matrix kann die Formel dafür geschrieben werden als.
matrix[i][j]=array[n*i+j]
Sehen Sie sich ein weiteres Beispielskript zum Hinzufügen von zwei Matrizen und zum Drucken der resultierenden Matrix an.
#!/bin/bash
read -p "Enter the matrix order [mxn] : " t
m=${t:0:1}
n=${t:2:1}
echo "Enter the elements for first matrix"
for i in `seq 0 $(($m-1))`
do
for j in `seq 0 $(($n-1))`
do
read x[$(($n*$i+$j))]
done
done
echo "Enter the elements for second matrix"
for i in `seq 0 $(($m-1))`
do
for j in `seq 0 $(($n-1))`
do
read y[$(($n*$i+$j))]
z[$(($n*$i+$j))]=$((${x[$(($n*$i+$j))]}+${y[$(($n*$i+$j))]}))
done
done
echo "Matrix after addition is"
for i in `seq 0 $(($m-1))`
do
for j in `seq 0 $(($n-1))`
do
echo -ne "${z[$(($n*$i+$j))]}\t"
done
echo -e "\n"
done
exit 0
Obwohl es Einschränkungen für die Implementierung von Arrays innerhalb von Shell-Skripten gibt, ist sie in einigen wenigen Situationen nützlich, insbesondere wenn wir mit der Befehlsersetzung arbeiten. Aus administrativer Sicht ebnete das Konzept der Arrays den Weg für die Entwicklung vieler Hintergrundskripte in GNU/Linux-Systemen.