Bash-skriptis tahaksin jagada rea tükkideks ja salvestada need massiivi.
Rida:
Paris, France, Europe
Ma tahaksin, et need oleksid massiivi kujul:
array[0] = Paris
array[1] = France
array[2] = Europe
Tahaksin kasutada lihtsat koodi, käsu'kiirusel ei ole tähtsust. Kuidas ma saan seda teha?
IFS=', ' read -r -a array <<< "$string"
Pange tähele, et $IFS
tähemärke käsitletakse eraldi eraldusmärkidena, nii et antud juhul võib väljad eraldada jumal koma või tühikuga, mitte kahe tähemärgi järjestusega. Huvitav on aga see, et tühjad väljad ei teki, kui sisendisse ilmub koma-vahe, sest tühikut käsitletakse eraldi.
Juurdepääs üksikutele elementidele:
echo "${array[0]}"
Elementide üle iteratsiooniks:
for element in "${array[@]}"
do
echo "$element"
done
Et saada nii indeks kui ka väärtus:
for index in "${!array[@]}"
do
echo "$index ${array[index]}"
done
Viimane näide on kasulik, sest Bash-massiivid on hõredad. Teisisõnu, te võite kustutada elemendi või lisada elemendi ja siis ei ole indeksid kõrvuti.
unset "array[1]"
array[42]=Earth
Et saada massiivi elementide arvu:
echo "${#array[@]}"
Nagu eespool mainitud, võivad massiivid olla hõredad, seega ei tohiks te kasutada pikkust viimase elemendi saamiseks. Siin'on, kuidas seda saab teha Bash 4.2 ja hilisemates versioonides:
echo "${array[-1]}"
mistahes Bash'i versioonis (alates kuskil pärast 2.05b):
echo "${array[@]: -1:1}"
Suuremad negatiivsed nihked valivad massiivist kaugemale. Pane tähele tühikut enne miinusmärki vanemas vormis. See on vajalik.
Siin on võimalus ilma IFS-i seadistamiseta:
string="1:2:3:4:5"
set -f # avoid globbing (expansion of *).
array=(${string//:/ })
for i in "${!array[@]}"
do
echo "$i=>${array[i]}"
done
Idee on kasutada stringi asendamist:
${string//substring/replacement}
et asendada kõik $substringi vasted valge tühikuga ja seejärel kasutada asendatud stringi massiivi initsialiseerimiseks:
(element1 element2 ... elementN)
Märkus: see vastus kasutab split+glob operaatorit. Seega, et vältida mõnede märkide (näiteks *
) laiendamist, on hea mõte selle skripti puhul globbing pausida.
Mõnikord juhtus minuga, et vastuvõetud vastuses kirjeldatud meetod ei toiminud, eriti kui eraldaja on veoraha.
Nendel juhtudel lahendasin ma nii:
string='first line
second line
third line'
oldIFS="$IFS"
IFS='
'
IFS=${IFS:0:1} # this is useful to format your code with tabs
lines=( $string )
IFS="$oldIFS"
for line in "${lines[@]}"
do
echo "--> $line"
done