Ответ 1
Другой способ:
x=$'Some\nstring'
readarray -t y <<<"$x"
Или, если у вас нет bash 4, эквивалент bash 3.2:
IFS=$'\n' read -rd '' -a y <<<"$x"
Вы также можете сделать это так, как вы изначально пытались использовать:
y=(${x//$'\n'/ })
Это, однако, не будет работать правильно, если ваша строка уже содержит пробелы, например 'line 1\nline 2'
. Чтобы заставить его работать, вам нужно ограничить разделитель слов до его разбора:
IFS=$'\n' y=(${x//$'\n'/ })
... и затем, поскольку вы меняете разделитель, вам больше не нужно преобразовывать \n
в space
, поэтому вы можете упростить его:
IFS=$'\n' y=($x)
Этот подход будет функционировать, если $x
не содержит сопоставимого шаблона глобуса (например, "*
" ), и в этом случае он будет заменен соответствующими именами файлов. Методы read
/readarray
требуют более новых версий bash, но работают во всех случаях.