IFS
нельзя использовать таким образом. Он не принимает регулярное выражение. Как минимум, символы (литерал ), составляющие IFS
, используются оболочкой для разделения слов при расширении слов. Например.
IFS=: read -r v1 v2 <<<"foo:bar"
То, что вы определили в IFS="[^a-zA-Z]"
, воспринимает символы буквально, т.е. каждый из [
, ^
, a
, -
, z
, A
, Z
и ]
является используются в качестве разделителей для разделения вашей входной строки, что явно не то, что вы ожидаете.
Вместо того, чтобы возиться с IFS
, вам лучше отобразить входную строку, а затем разбить ее, используя IFS по умолчанию:
read -ra name_parts <<<"$(printf '%s\n' "$input" | LC_ALL=C tr -cs 'a-zA-Z\n' '[ *]')"
Теперь часть имени массива _будет содержать строку, разрезанную по небуквенным позициям.
IFS
— это просто набор символов (или байтов ), а не регулярное выражение. Но вы можете использовать, например. awk или sed, чтобы разделить строку на основе регулярного выражения, распечатать ее с более простым разделителем, а затем прочитать с помощью read
оболочки.
read -ra name_parts < <(awk -vFS='[^a-zA-Z]' -vOFS=' ' '{$1=$1; print}' <<< "$input")
или
read -ra name_parts < <(sed -e 's/[^a-zA-Z]/ /g' <<< "$input")