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"