Vreau să accesez variabila index a matricei în timp ce fac looping printr-o matrice în scriptul meu shell bash.
myscript.sh
#!/bin/bash AR=("foo" "bar" "baz" "bat") for i in ${AR[*]}; do echo $i done
Rezultatul scriptului de mai sus este:
foo bar baz bat
Rezultatul pe care îl caut este:
0 1 2 3
Cum îmi modific scriptul pentru a realiza acest lucru?
Comentarii
Răspuns
Puteți face acest lucru folosind Lista de chei matrice . Din bash
pagina manuală:
${!name[@]}
${!name[*]}
Lista tastelor matrice . Dacă numele este o variabilă de matrice, se extinde la lista indicilor matricei (chei) atribuite în nume. Dacă numele nu este o matrice, se extinde la
0
dacă numele este setat și nul în caz contrar. Când se utilizează@
și extinderea apare în ghilimele duble, fiecare cheie se extinde la un cuvânt separat.
Pentru exemplul dvs.:
#!/bin/bash AR=("foo" "bar" "baz" "bat") for i in "${!AR[@]}"; do printf "${AR[%s]}=%s\n" "$i" "${AR[i]}" done
Acest lucru are ca rezultat:
${AR[0]}=foo ${AR[1]}=bar ${AR[2]}=baz ${AR[3]}=bat
Rețineți că lucrează pentru indici nesuccesivi:
#!/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
Acest lucru are ca rezultat:
${AR[3]}=foo ${AR[5]}=bar ${AR[7]}=bat ${AR[25]}=baz
Comentarii
- Deși acest răspuns realizează rezultatul dorit, acesta este în mod inutil însoțit de declarația printf. De exemplu:
printf "$i=(${AR[i]})\n"
sauecho "$i=(${ARi]})"
ambele oferă un pic în plus, arătând cum se obține cheia & var dar strict vorbindecho "$i"
ar fi răspuns OP. Restul este " bash fu " 🙂 - De ce nu este posibil:
a=(1 2);echo ${a[0]} # result: 1
?
Răspuns
În plus față de răspunsul jordanm, puteți face și un C
buclă asemănătoare în bash
:
for ((idx=0; idx<${#array[@]}; ++idx)); do echo "$idx" "${array[idx]}" done
Comentarii
- Numai dacă nu a fost un tablou rar …
Răspuns
puteți face așa ceva:
#!/bin/bash AR=("foo" "bar" "baz" "bat") length=${#AR[@]} for (( i = 0; i < length; i++ )); do echo "$i" done
ieșire:
0 1 2 3
Comentarii
- Ce spune asta că răspunsul pfnuesel nu spune deja?
- S-ar putea să mă înșel, dar răspunsul pfnuesels nu reevaluează lungimea matricei pe fiecare iterație?
"${array[*]}"
în loc de"${array[@]}"
. Utilizarea*
în loc de@
o tratează mai mult sau mai puțin ca un șir în loc de un tablou.