2016-01-01 6 views
1

Я читал на этом посту: bash "for in" looping on null delimited string variable , чтобы узнать, смогу ли я обрабатывать произвольный текст, содержащий пробелы внутри массива.bash "read -a" looping on string string string

Основываясь на пост выше это работает отлично:

while IFS= read -r -d '' myvar; do echo $myvar; done < <(find . -type f -print0) 

Чтобы проверить свое понимание я это сделал (который до сих пор работает отлично):

while IFS= read -r -d '' myvar; do echo $myvar; done < <(printf "%s\0" 'a b' 'c d') 

Однако я попытка сохранения вывода в массиве он идет не так:

IFS= read -r -d '' -a myvar < <(printf "%s\0" 'a b' 'c d') 

Массив содержит только a b и не c d:

echo ${myvar[@]} 
a b 

По-видимому, есть тонкие детали я здесь отсутствует. Спасибо за любую помощь.

PS. Я бегу:

GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin14) 
Copyright (C) 2007 Free Software Foundation, Inc. 
+2

Из 'help read': * Прочитайте строку со стандартного ввода и разделите его на поля. * 'A b \ 0c d' больше, чем одна строка. – Cyrus

+3

'read -a' предназначен для назначения слов в одной строке в массив. Чтобы прочитать строки с нулевым ограничением в массив: 'unset arr i; в то время как IFS = read -r -d '' 'arr [i ++]'; делать :; done <<(printf "% s \ 0" 'a b' 'c d') '. – 4ae1e1

+0

И строка по определению заканчивается ascii 0, правильно? Например, Newline является только символом форматирования? –

ответ

4

bash В 4,4 (еще не выпущен), в readarray команда получает -d вариант аналогичен той же опции для read.

$ IFS= readarray -d '' myvar < <(printf "%s\0" 'a b' 'c d') 
$ printf "%s\n" "${myvar[@]}" 
a b 
c d 

До тех пор (или если вы должны поддерживать более ранние версии), вы должны явно пропустить вывод.

while IFS= read -d '' line; do 
    myvar+=("$line") 
done < <(printf "%s\0" 'a b' 'c d') 
+0

Полезно знать 'readarray', наконец, получает' -d'. Это действительно естественный вариант. – 4ae1e1

+0

'myvar + = (" $ line ")' расщепляется на символ пробела –

+0

@ ToreH-W Не когда цитируется '$ line'. – chepner