Tilgang til variabel for arrayindeks fra bash shell script loop?

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

  • Legg også merke til at du i utgangspunktet aldri vil ha "${array[*]}" i stedet for "${array[@]}". Ved å bruke * i stedet for @ behandles det mer eller mindre som en streng i stedet for en matrise.

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" eller echo "$i=(${ARi]})" gir begge litt ekstra ved å vise hvordan du får nøkkel & var men strengt tatt echo "$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?

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *