Есть две основные проблемы здесь : установка IFS
влияет на многие вещи в том, как оболочка анализирует строки, в том числе некоторые, которых вы не ожидаете; и оставляя $3
unquoted, это может стать одной из вещей, которые перепутались.
Что происходит, когда вы ссылаетесь на $3
без двойных кавычек вокруг него, оболочка разбивает его на «слова», используя $IFS
в качестве разделителя (ов). В вашем примере это дает три слова: «Вариант 1», «Вариант 2» и «Вариант 3». В контексте <<<
он затем объединяет их обратно, используя пространство как разделитель (что странно, но это то, что он делает), давая «Вариант 1 Вариант 2 Вариант 3». Вы можете увидеть этот эффект отдельно:
$ foo="Option 1,Option 2,Option 3"
$ IFS=,
$ cat <<< $foo
Option 1 Option 2 Option 3
Итак команда read
получает «Вариант 1 Вариант 2 Варианта 3» в качестве входных данных, разбивает его на основе $IFS
(«»), приходит к выводу, что нет никаких разделителей слов, поэтому он помещает все это в элемент # 0 optionList
.
Вы можете исправить это путем двойного цитирования $3
, чтобы предотвратить расщепление слов, но у вас появятся другие проблемы, потому что IFS
также повлияет на множество других вещей на вашем скрипте. Поэтому вы должны также следовать рекомендации anubhava, чтобы сделать IFS
назначением префикса в команде read
, так что влияет только на эту команду, а не на глобальное изменение того, как оболочка анализирует строки.
Так как с изменениями, моя рекомендация состоит в том, чтобы использовать:
IFS=, read -ra optionList <<< "$3"
... так же, как рекомендации анубхава в.
Обратите внимание, что канонический путь будет следующим: 'IFS =, read -r -d '' -a optionList <<(printf '% s, \ 0'" $ 3 ")'. –