Padalyti eilutę į masyvą naudojant "Bash

"Bash" scenarijuje norėčiau padalyti eilutę į dalis ir jas išsaugoti masyve.

Eilutė:

Paris, France, Europe

Norėčiau, kad jie būtų išdėstyti masyve taip:

array[0] = Paris
array[1] = France
array[2] = Europe

Norėčiau naudoti paprastą kodą, komandos greitis nesvarbus. Kaip tai padaryti?

Čia pateikiamas būdas nenustatant IFS:

string="1:2:3:4:5"
set -f                      # avoid globbing (expansion of *).
array=(${string//:/ })
for i in "${!array[@]}"
do
    echo "$i=>${array[i]}"
done

Idėja - naudoti eilutės pakeitimą:

${string//substring/replacement}

pakeisti visus $substring atitikmenis baltu tarpu ir tada pakeisti pakeistą eilutę inicializuoti masyvą:

(element1 element2 ... elementN)

Pastaba: šiame atsakyme naudojamas split+glob operatorius. Taigi, norint išvengti kai kurių simbolių (pvz., *) išsiplėtimo, šiame scenarijuje verta pristabdyti globbing'ą.

Komentarai (16)

Kartais man pasitaikydavo, kad priimtame atsakyme aprašytas metodas neveikdavo, ypač jei skyrybos ženklas yra vežimėlio grįžimas.
Tokiais atvejais spręsdavau tokiu būdu:

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