A tömbindex-változó elérése a bash shell script ciklusból?

Hozzá akarok férni a tömbindex változóhoz, miközben egy tömböt hurokozok az én bash shell szkriptemben.

myscript.sh

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

A fenti szkript eredménye:

foo bar baz bat 

A keresett eredmény:

0 1 2 3 

Hogyan módosíthatom a szkriptemet ennek elérése érdekében?

Megjegyzések

  • Vegye figyelembe azt is, hogy alapvetően soha want "${array[*]}" a "${array[@]}" helyett. A * használata a @ helyett többé-kevésbé karakterláncként kezeli tömb helyett.

Válasz

Ezt a Tömbkulcsok listája segítségével teheti meg. A bash man oldalról:

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

Tömbkulcsok listája . Ha a név tömb változó, akkor kibővül a névhez rendelt tömbindexek (kulcsok) listájához. Ha a név nem tömb, akkor kibővül a 0 értékre, ha a név be van állítva és különben null. A @ használatakor, és a kibővítés kettős idézőjelben jelenik meg, minden kulcs külön szóvá bővül.

Például:

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

Ennek eredménye:

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

Vegye figyelembe, hogy ez is munka nem egymást követő indexeknél:

#!/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 

Ennek eredménye:

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

Megjegyzések

  • Bár ez a válasz eléri a kívánt eredményt, a printf utasítás feleslegesen elhomályosítja. Például: printf "$i=(${AR[i]})\n" vagy echo "$i=(${ARi]})" mindkettő ad egy kis pluszt azáltal, hogy megmutatja, hogyan lehet megszerezni a kulcsot & var, de szigorúan véve echo "$i" válaszolt volna az OP-ra. A többi " bash fu " 🙂
  • Miért nem lehetséges: a=(1 2);echo ${a[0]} # result: 1?

Válasz

A jordanm válaszán kívül egy C hasonló hurok a bash -ben:

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

megjegyzések

  • Csak akkor, ha nem ritka tömb volt …

Válasz

ilyet tehet:

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

output:

0 1 2 3 

Megjegyzések

  • Mit mond ez, hogy A pfnuesel válasza még nem mondja meg?
  • Lehet, hogy tévedek, de a pfnuesel válasza nem értékeli-e újra az egyes iterációk tömbhosszát?

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük