Разделить слова из `read` и сохранить в массив?

Используя только конструкции sh POSIX, вы можете использовать конструкции подстановки параметров для анализа одного разделителя на время. Обратите внимание, что этот код предполагает наличие необходимого количества полей, в противном случае повторяется последнее поле.

string='one_two_three_four_five'
remainder="$string"
first="${remainder%%_*}"; remainder="${remainder#*_}"
second="${remainder%%_*}"; remainder="${remainder#*_}"
third="${remainder%%_*}"; remainder="${remainder#*_}"
fourth="${remainder%%_*}"; remainder="${remainder#*_}"

В качестве альтернативы можно использовать замену параметра без кавычек с отключенным раскрытием подстановочных знаков и IFS , установленным на символ-разделитель (это работает только в том случае, если разделитель представляет собой один не- символ пробела или если какая-либо последовательность пробелов является разделителем).

string='one_two_three_four_five'
set -f; IFS='_'
set -- $string
second=$2; fourth=$4
set +f; unset IFS

Это затирает позиционные параметры. Если вы сделаете это в функции, это затронет только позиционные параметры функции.

Еще один подход - использовать встроенную функцию read .

IFS=_ read -r first second third fourth trail <<'EOF'
one_two_three_four_five
EOF

2
20.05.2016, 04:49
2 ответа

Если вы используете bash , его Команда чтения имеет для этого параметр -a .

Из помогите прочитать

Options:
  -a array  assign the words read to sequential indices of the array
        variable ARRAY, starting at zero

Итак

$ read -a s
This is a sentence.

Обратите внимание, что результирующий массив проиндексирован нулем, поэтому

$ echo "${s[0]}"
This
$ echo "${s[1]}"
is
$ echo "${s[2]}"
a
$ echo "${s[3]}"
sentence.
$ 
6
27.01.2020, 21:52

Ответ, аналогичный ответу @steeldriver

#!/bin/bash
printf "Input text:" && read UI ;
read -a UIS <<< ${UI} ;
X=0 ;
for iX in ${UIS[*]} ; do printf "position: ${X}==${iX}\n" ; ((++X)) ; done ;
1
27.01.2020, 21:52

Теги

Похожие вопросы