Основная проблема с вашей попыткой - расщепление слов не выполняется с herestring .От man bash:
Here Strings
A variant of here documents, the format is:
<<<word
... Pathname expansion and word splitting are not performed.
The result is supplied as a single string to the command on its
standard input.
Bash действительно предоставляет heredoc (например, «Здесь документ» в man bash), на котором расщепление слов будет выполнен со значением по умолчанию IFS
.Однако даже тогда вы все равно будете читать литерал '\n'
как часть содержимого массива.Не бойтесь, bash предоставил особый способ избежать этого с опцией -t
, равной readarray
(a / k / a mapfile
).
Короткий пример, настолько близкий, насколько яВы можете получить исходную попытку:
readarray -t arr << EOF
line1
line2
line3
EOF
declare -p arr
В результате ваши строки будут сохранены по желанию, например, вы получите:
declare -a arr='([0]="line1" [1]="line2" [2]="line3")'
Другой вариант - использовать процесс подстановки и пусть printf
обеспечивает разбиение, например,
readarray -t arr < <(printf "line1\nline2\nline3\n")
Ключ для заполнения массива без включенных новых строк - readarray -t
, ключ для разрешения разделения словэто избегать herestring .