Opdele streng i et array i Bash

I et Bash-script vil jeg gerne opdele en linje i stykker og gemme dem i et array.

Linjen:

Paris, France, Europe

Jeg vil gerne have dem i et array som dette:

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

Jeg vil gerne bruge simpel kode, kommandoen's hastighed er ligegyldig. Hvordan kan jeg gøre det?

Her er en måde at gøre det på uden at indstille 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

Ideen er at bruge strengudskiftning:

${string//substring/replacement}

til at erstatte alle match af $substring med hvidt mellemrum og derefter bruge den erstattede streng til at initialisere et array:

(element1 element2 ... elementN)

Bemærk: Dette svar gør brug af [split+glob-operatoren] (https://unix.stackexchange.com/q/108963/79743). For at forhindre ekspansion af visse tegn (såsom *) er det således en god idé at sætte globbing på pause for dette script.

Kommentarer (16)

Nogle gange er det sket for mig, at den metode, der er beskrevet i det accepterede svar, ikke virkede, især hvis separatoren er en vogn retur.
I de tilfælde løste jeg det på denne måde:

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