Zugriff auf Array-Indexvariable über die Bash-Shell-Skriptschleife?

Ich möchte auf die Array-Indexvariable zugreifen, während ich ein Array in meinem Bash-Shell-Skript durchlaufe.

myscript.sh

#!/bin/bash AR=("foo" "bar" "baz" "bat") for i in ${AR[*]}; do echo $i done 

Das Ergebnis des obigen Skripts ist:

foo bar baz bat 

Das gesuchte Ergebnis ist:

0 1 2 3 

Wie ändere ich mein Skript, um dies zu erreichen?

Kommentare

  • Beachten Sie auch, dass Sie im Grunde nie möchte "${array[*]}" anstelle von "${array[@]}". Wenn Sie * anstelle von @ verwenden, wird es mehr oder weniger als Zeichenfolge anstelle eines Arrays behandelt.

Antwort

Sie können dies mit Liste der Array-Schlüssel tun. Auf der Manpage bash:

${!name[@]}
${!name[*]}

Liste der Array-Schlüssel . Wenn name eine Arrayvariable ist, wird die Liste der im Namen zugewiesenen Arrayindizes (Schlüssel) erweitert. Wenn name kein Array ist, wird es auf 0 erweitert, wenn name festgelegt ist, andernfalls auf null. Wenn @ verwendet wird und die Erweiterung in doppelten Anführungszeichen angezeigt wird, wird jeder Schlüssel zu einem separaten Wort erweitert.

Für Ihr Beispiel:

#!/bin/bash AR=("foo" "bar" "baz" "bat") for i in "${!AR[@]}"; do printf "${AR[%s]}=%s\n" "$i" "${AR[i]}" done 

Dies führt zu:

${AR[0]}=foo ${AR[1]}=bar ${AR[2]}=baz ${AR[3]}=bat 

Beachten Sie, dass dies auch gilt Arbeiten für nicht aufeinanderfolgende Indizes:

#!/bin/bash AR=([3]="foo" [5]="bar" [25]="baz" [7]="bat") for i in "${!AR[@]}"; do printf "${AR[%s]}=%s\n" "$i" "${AR[i]}" done 

Dies führt zu:

${AR[3]}=foo ${AR[5]}=bar ${AR[7]}=bat ${AR[25]}=baz 

Kommentare

  • Obwohl diese Antwort das gewünschte Ergebnis erzielt, wird sie durch die printf-Anweisung unnötig verschleiert. Beispiel: printf "$i=(${AR[i]})\n" oder echo "$i=(${ARi]})" geben beide ein kleines Extra, indem sie zeigen, wie der Schlüssel & var aber genau genommen hätte echo "$i" das OP beantwortet. Der Rest ist " bash fu " 🙂
  • Warum ist das nicht möglich: a=(1 2);echo ${a[0]} # result: 1?

Antwort

Zusätzlich zu Jordanms Antwort können Sie auch ein C ähnliche Schleife in bash:

for ((idx=0; idx<${#array[@]}; ++idx)); do echo "$idx" "${array[idx]}" done 

Kommentare

  • Nur wenn es sich nicht um ein spärliches Array handelt …

Antwort

Sie können Folgendes tun:

 #!/bin/bash AR=("foo" "bar" "baz" "bat") length=${#AR[@]} for (( i = 0; i < length; i++ )); do echo "$i" done  

Ausgabe:

0 1 2 3 

Kommentare

  • Was bedeutet dies, dass pfnuesels Antwort sagt nicht schon?
  • Ich kann mich irren, aber pfnuesels Antwort bewertet die Array-Länge nicht bei jeder Iteration neu?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.