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
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"
taiecho "$i=(${ARi]})"
molemmat antavat hieman ylimääräistä osoittamalla, kuinka avain & var, mutta tarkkaan ottaenecho "$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?
"${array[*]}"
"${array[@]}"
-kohdan sijaan. Käyttämällä*
@
-kohdan sijaan enemmän tai vähemmän käsitellään sitä merkkijonona matriisin sijaan.