одним рядком

написав собі функцію для «розрізання» текстового рядка на слова.

split_parameters () {
($DEBUG) && printf "Received: «%s»\n" "$PARAM_STRING"

($DEBUG) && printf "Start parsing parameters string...\n"

# Parameters string is not empty, contains
# at least one character
local TOKEN=""
local CHAR=""
local i=0

# Split the raw parameters string into array
while [[ i -lt "${#PARAM_STRING}" ]] ; do
local CHAR="${PARAM_STRING:$i:1}"

($DEBUG) && printf " Reading %s: «%s» (current token: «%s», string=%s)\n" $i "$CHAR" "$TOKEN" "$STRING"

case "$CHAR" in
" " )
PARAM_ARRAY+=("$TOKEN")
TOKEN=""
CHAR=""
;;

* )
# Any other character just goes to the current token
TOKEN="$TOKEN$CHAR"
CHAR=""
;;
esac
i=$( expr $i + 1 )
done

# Do not forget that token still contains last parameter
PARAM_ARRAY+=("$TOKEN")

($DEBUG) && printf "Finished parsing. Checking array...\n"

# Process the parametrs array to set options and read value
for (( i=0; i <= $(expr ${#PARAM_ARRAY[@]} - 1 ) ; i++ )) ; do
printf " Element %s: «%s»\n" $i "${PARAM_ARRAY[i]}"
done

}

вельми задоволений собою. але те саме робиться одним рядком:

IFS=', ' read -r -a PARAM_ARRAY <<< "$PARAM_STRING"

насправді, звісно, не все так просто. я знав про рішення з read, але сподівався навчитися зберігати фрагменти між лапками ("…") вкупі, в одному елементі масиву. не вийшло — бо оболонка прибирає ті рядки ще на етапі передачі параметрів скрипту, як я зрозумів.

тому повернувся до простішого one-liner'а.

p.s. вподобав собі розставляти чекпоінти для зневадження, згодом DEBUG=true вельми спрощує життя, якщо коли щось іде не так:

($DEBUG) && printf "…\n"