Используя только конструкции 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
Если вы используете 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.
$
Ответ, аналогичный ответу @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 ;