Jeg vil ha tilgang til variabel for arrayindeks mens jeg går gjennom en matrise i bash shell-skriptet.
myscript.sh
#!/bin/bash AR=("foo" "bar" "baz" "bat") for i in ${AR[*]}; do echo $i done
Resultatet av skriptet ovenfor er:
foo bar baz bat
Resultatet jeg søker er:
0 1 2 3
Hvordan endrer jeg skriptet mitt for å oppnå dette?
Kommentarer
Svar
Du kan gjøre dette ved å bruke Liste over arraynøkler . Fra bash
man-siden:
${!name[@]}
${!name[*]}
Liste over arraynøkler . Hvis navn er en matrixvariabel, utvides den til listen over matriseindekser (nøkler) tildelt i navnet. Hvis navnet ikke er en matrise, utvides det til
0
hvis navnet er angitt og ellers null. Når@
brukes og utvidelsen vises i dobbelt anførselstegn, utvides hver nøkkel til et eget ord.
For eksempel:
#!/bin/bash AR=("foo" "bar" "baz" "bat") for i in "${!AR[@]}"; do printf "${AR[%s]}=%s\n" "$i" "${AR[i]}" done
Dette resulterer i:
${AR[0]}=foo ${AR[1]}=bar ${AR[2]}=baz ${AR[3]}=bat
Merk at dette også arbeid for ikke-påfølgende indekser:
#!/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
Dette resulterer i:
${AR[3]}=foo ${AR[5]}=bar ${AR[7]}=bat ${AR[25]}=baz
Kommentarer
- Selv om dette svaret oppnår ønsket resultat, blir det unødvendig tilslørt av printf-uttalelsen. For eksempel:
printf "$i=(${AR[i]})\n"
ellerecho "$i=(${ARi]})"
gir begge litt ekstra ved å vise hvordan du får nøkkel & var men strengt tattecho "$i"
ville ha svart OP. Resten er " bash fu " 🙂 - Hvorfor er det ikke mulig:
a=(1 2);echo ${a[0]} # result: 1
?
Svar
I tillegg til jordanms svar kan du også gjøre et C
som loop i bash
:
for ((idx=0; idx<${#array[@]}; ++idx)); do echo "$idx" "${array[idx]}" done
Kommentarer
- Bare hvis det ikke var et sparsomt utvalg …
Svar
du kan gjøre noe sånt som dette:
#!/bin/bash AR=("foo" "bar" "baz" "bat") length=${#AR[@]} for (( i = 0; i < length; i++ )); do echo "$i" done
output:
0 1 2 3
Kommentarer
- Hva sier dette at svaret fra pfnuesel sier ikke allerede?
- Jeg kan ta feil, men svarer ikke pfnuesels svar ikke om matrilengden på hver iterasjon på nytt?
"${array[*]}"
i stedet for"${array[@]}"
. Ved å bruke*
i stedet for@
behandles det mer eller mindre som en streng i stedet for en matrise.