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"
oderecho "$i=(${ARi]})"
geben beide ein kleines Extra, indem sie zeigen, wie der Schlüssel & var aber genau genommen hätteecho "$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?