одним рядком

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

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"

2 коментар(ів):

piktor сказав...

Вчи python, та є функція split.

івась тарасик сказав...

ні, кожному своє.

Дописати коментар

увага!
коментарі не модерую, проте спам видаляю нещадно. посилання на інші сайти/блоги за темою допису вітаю.

додаткові можливості розмітки (кутики набрати з клавіатури):
  ‹b›жирний шрифт‹/b›
  ‹i›похилий шрифт‹/i›
  ‹a href="http://tivasyk.info"›посилання‹/a›