Accesați variabila index de matrice din bucla de script shell bash?

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

  • Rețineți, de asemenea, că, practic, niciodată doresc "${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.

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" sau echo "$i=(${ARi]})" ambele oferă un pic în plus, arătând cum se obține cheia & var dar strict vorbind echo "$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?

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *