Matriisihakemistomuuttujan käyttö bash-komentosarjasilmukasta?

Haluan käyttää taulukon indeksimuuttujaa samalla, kun silmukan läpi matriisin bash-komentosarjakomentosarjassa.

myscript.sh

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

Yllä olevan komentosarjan tulos on:

foo bar baz bat 

Etsin tulosta:

0 1 2 3 

Kuinka voin muuttaa komentosarjaani tämän saavuttamiseksi?

Kommentit

  • Huomaa myös, että et periaatteessa koskaan haluaa "${array[*]}" "${array[@]}" -kohdan sijaan. Käyttämällä * @ -kohdan sijaan enemmän tai vähemmän käsitellään sitä merkkijonona matriisin sijaan.

Vastaus

Voit tehdä tämän käyttämällä Luettelo taulukkoavaimista . bash -sivulta:

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

Luettelo taulukkoavaimista . Jos nimi on matriisimuuttuja, laajenee luetteloon nimessä annetut taulukkoindeksit (avaimet). Jos nimi ei ole matriisi, laajenee muotoon 0, jos nimi on asetettu ja muuten tyhjä. Kun @ käytetään ja laajennus näkyy lainausmerkeissä, kukin avain laajenee erilliseksi sanaksi.

Esimerkiksi:

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

Tämän tuloksena on:

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

Huomaa, että myös tämä toimi ei-peräkkäisillä hakemistoilla:

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

Tästä seuraa:

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

kommentteja

  • Vaikka tämä vastaus saavuttaa toivotun lopputuloksen, printf-käsky hämmentää sitä tarpeettomasti. Esimerkiksi: printf "$i=(${AR[i]})\n" tai echo "$i=(${ARi]})" molemmat antavat hieman ylimääräistä osoittamalla, kuinka avain & var, mutta tarkkaan ottaen echo "$i" olisi vastannut toimenpideohjelmaan. Loput ovat " bash fu " 🙂
  • miksi se ei ole mahdollista: a=(1 2);echo ${a[0]} # result: 1?

Vastaa

Jordanian vastauksen lisäksi voit tehdä myös C kuten silmukka bash:

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

kommenteissa

  • Vain, jos se ei ollut harvinainen taulukko …

Vastaa

voit tehdä jotain tällaista:

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

output:

0 1 2 3 

Kommentit

  • Mitä tämä sanoo, että Pfnueselin vastaus ei vielä kerro?
  • Voin olla väärässä, mutta eikö pfnuesel-vastaus arvioi uudelleen kunkin iteraation matriisin pituutta?

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *