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