"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?
IFS=', ' read -r -a array <<< "$string"
Atkreipkite dėmesį, kad $IFS
simboliai atskirai traktuojami kaip skyrybos ženklai, todėl šiuo atveju laukai gali būti atskirti kableliu arba tarpu, o ne šių dviejų simbolių seka. Įdomu tai, kad tušti laukai nesukuriami, kai įvestyje atsiranda kablelis ir tarpas, nes tarpas traktuojamas specialiai.
Norėdami pasiekti atskirą elementą:
echo "${array[0]}"
Elementų iteracija:
for element in "${array[@]}"
do
echo "$element"
done
Norėdami gauti ir indeksą, ir vertę:
for index in "${!array[@]}"
do
echo "$index ${array[index]}"
done
Pastarasis pavyzdys naudingas, nes "Bash" masyvai yra reti. Kitaip tariant, galite ištrinti elementą arba pridėti elementą ir tada indeksai nebus gretimi.
unset "array[1]"
array[42]=Earth
Elementų skaičiui masyve gauti:
echo "${#array[@]}"
Kaip minėta, masyvai gali būti reti, todėl paskutiniam elementui gauti nereikėtų naudoti ilgio. Štai kaip tai padaryti "Bash 4.2" ir vėlesnėse versijose:
echo "${array[-1]}"
bet kurioje "Bash" versijoje (pradedant nuo 2.05b):
echo "${array[@]: -1:1}"
Didesni neigiami poslinkiai pasirenkami toliau nuo masyvo galo. Atkreipkite dėmesį į tarpą prieš minuso ženklą senesnėje formoje. Jis yra privalomas.
Č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'ą.
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