Обратите внимание, что сохранение и восстановление IFS, как я часто видел в этих решениях, имеет побочный эффект: если IFS не был установлен, он в конечном итоге изменится на пустую строку, что вызывает странные проблемы с последующим разбиением.
Вот решение, которое я придумала на основе * * Антона Олсена, расширенного для обработки> 2 значений, разделенных двоеточием. Он обрабатывает значения в списке, которые имеют пробелы правильно, без разделения на пробелы.
colon_list=${1} # colon-separate list to split
while true ; do
part=${colon_list%%:*} # Delete longest substring match from back
colon_list=${colon_list#*:} # Delete shortest substring match from front
parts[i++]=$part
# We are done when there is no more colon
if test "$colon_list" = "$part" ; then
break
fi
done
# Show we've split the list
for part in "${parts[@]}"; do
echo $part
done