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
0erweitert, 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?