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
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"
vagyecho "$i=(${ARi]})"
mindkettő ad egy kis pluszt azáltal, hogy megmutatja, hogyan lehet megszerezni a kulcsot & var, de szigorúan véveecho "$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?
"${array[*]}"
a"${array[@]}"
helyett. A*
használata a@
helyett többé-kevésbé karakterláncként kezeli tömb helyett.