V skripti Bash bi rad razdelil vrstico na dele in jih shranil v polje.
Vrstica:
Paris, France, Europe
Rad bi jih imel v polju, kot je to:
array[0] = Paris
array[1] = France
array[2] = Europe
Rad bi uporabil preprosto kodo, hitrost ukaza ni pomembna. Kako lahko to naredim?
IFS=', ' read -r -a array <<< "$string"
Upoštevajte, da se znaki v $IFS
obravnavajo posamično kot ločila, tako da lahko v tem primeru polja ločite z vejico ali presledkom in ne z zaporedjem teh dveh znakov. Zanimivo pa je, da se prazna polja ne ustvarijo, če se v vnosu pojavi vejica in presledek, ker se presledek obravnava posebej.
Dostop do posameznega elementa:
echo "${array[0]}"
Za iteracijo po elementih:
for element in "${array[@]}"
do
echo "$element"
done
Za pridobitev indeksa in vrednosti:
for index in "${!array[@]}"
do
echo "$index ${array[index]}"
done
Zadnji primer je uporaben, ker so polja Bash redka. Z drugimi besedami, lahko izbrišete element ali dodate element in takrat indeksi niso sosednji.
unset "array[1]"
array[42]=Earth
Če želite dobiti število elementov v polju:
echo "${#array[@]}"
Kot smo že omenili, so lahko polja redka, zato za pridobitev zadnjega elementa ne smete uporabiti dolžine. V različici Bash 4.2 in novejših različicah lahko to storite na naslednji način:
echo "${array[-1]}"
v kateri koli različici programa Bash (nekje od različice 2.05b naprej):
echo "${array[@]: -1:1}"
Večji negativni odmiki izbirajo dlje od konca polja. V starejši obliki upoštevajte presledek pred znakom minus. Ta je obvezen.
Tukaj je način brez nastavitve 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
Zamisel je uporaba zamenjave niza:
${string//substring/replacement}
za zamenjavo vseh zadetkov $substring z belim presledkom in nato uporabi zamenjani niz za inicializacijo polja:
(element1 element2 ... elementN)
Opomba: v tem odgovoru je uporabljen operator split+glob. Da bi preprečili širjenje nekaterih znakov (kot je *
), je zato dobro, da za to skripto prekinete globbing.
Včasih se mi je zgodilo, da metoda, opisana v sprejetem odgovoru, ni delovala, zlasti če je ločilo povratek.
V teh primerih sem to rešil na naslednji način:
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