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.