Stringi jagamine massiiviks Bashis

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?

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.

Kommentaarid (16)

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
Kommentaarid (3)