Bash-Arrays

Hier ist eine Übersetzung von Mitch Fraziers " Bash Arrays " von linuxjournal.com.



Wenn Sie die "Standard" * NIX-Shell verwenden, sind Sie möglicherweise nicht mit der nützlichen Bash-Funktion von Arrays vertraut. Während Arrays in Bash nicht so cool sind wie in P-Sprachen (Perl, Python und PHP) und anderen Programmiersprachen, sind sie oft nützlich.

Bash-Arrays haben nur numerische Indizes, sie sind jedoch optional, dh Sie müssen die Werte aller Indizes nicht explizit definieren. Ein ganzes Array kann definiert werden, indem die Einträge in Klammern gesetzt werden:



  arr=(Hello World)


Einzelne Datensätze können mit der bekannten Syntax definiert werden (von BASIC (verzeihen Sie mir Dijkstra - Anmerkung des Übersetzers) bis Fortran):



  arr[0]=Hello
  arr[1]=World




Das Gegenteil sieht jedoch vergleichsweise hässlicher aus. Wenn Sie sich auf einen bestimmten Eintrag beziehen müssen, dann:



  echo ${arr[0]} ${arr[1]}


Auf der Manpage:



" Geschweifte Klammern sind erforderlich, um Konflikte beim Erweitern vollständiger Dateipfade zu vermeiden. "



Darüber hinaus stehen die folgenden seltsamen Konstrukte zur Verfügung:



  ${arr[*]} #    
  ${!arr[*]}#    
  ${#arr[*]}#    
  ${#arr[0]}#    (  )


$ {! arr [*]} ist eine relativ neue Ergänzung zu bash und nicht Teil der ursprünglichen Implementierung. Die folgende Konstruktion zeigt ein Beispiel für eine einfache Verwendung eines Arrays. Beachten Sie den "[Index] = Wert", mit dem Sie einer bestimmten Datensatznummer einen bestimmten Wert zuweisen können.



#!/bin/bash

array=(one two three four [5]=five)

echo "Array size: ${#array[*]}"  #   

echo "Array items:" #   
for item in ${array[*]}
do
    printf "   %s\n" $item
done

echo "Array indexes:" #   
for index in ${!array[*]}
do
    printf "   %d\n" $index
done

echo "Array items and indexes:" #      
for index in ${!array[*]}
do
    printf "%4d: %s\n" $index ${array[$index]}
done


Durch Ausführen des Skripts wird die folgende Ausgabe generiert:



Array-Größe: 5



Array-Elemente:



eins

zwei

drei

vier

fünf



Array-Indizes:



0

1

2

3

5



Array-Elemente und -Indizes:



0: eins

1: zwei

2: drei

3: vier

5: fünf



Beachten Sie Folgendes Das "@" - Zeichen kann in Konstrukten wie {arr [*]} anstelle von "*" verwendet werden. Das Ergebnis ist bis auf die Erweiterung des angegebenen Eintrags dasselbe. "$ *" und "$ @" geben Anführungszeichen in Anführungszeichen aus, "$ {arr [*]}" gibt jeden Eintrag als ein Wort zurück, "$ {arr [@]}" gibt jeden Eintrag als separates Wort zurück.



Das folgende Beispiel zeigt, wie Anführungszeichen und nicht zitierte Konstrukte Zeichenfolgen zurückgeben (besonders wichtig, wenn diese Zeichenfolgen Leerzeichen enthalten):



#!/bin/bash

array=("first item" "second item" "third" "item")

echo "Number of items in original array: ${#array[*]}"
for ix in ${!array[*]}
do
    printf "   %s\n" "${array[$ix]}"
done
echo

arr=(${array[*]})
echo "After unquoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done
echo

arr=("${array[*]}")
echo "After * quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done
echo

arr=("${array[@]}")
echo "After @ quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done


Ausgabe beim Start:



Anzahl der Elemente im ursprünglichen Array: 4



erstes Element

zweites Element

drittes

Element



Nach nicht zitierter Erweiterung: 6



erstes

Element

zweites

Element

drittes

Element



Nach * zitierter Erweiterung: 1



erstes Element zweites Element drittes Element



Nach @ zitierter Erweiterung: 4



erstes Element

zweites Artikel

dritter

Artikel



All Articles