data.in
:Bash: Разделить строку в кавычках в массив
a b c 'd e'
script.sh
:
while read -a arr; do
echo "${#arr[@]}"
for i in "${arr[@]}"; do
echo "$i"
done
done
Команда:
cat data.in | bash script.sh
Выход:
5
a
b
c
'd
e'
Вопрос:
Как я могу получить 'd e'
как отдельный элемент в массиве?
Обновление. Это лучшее, что я сделал до сих пор:
while read line; do
arr=()
while read word; do
arr+=("$word")
done < <(echo "$line" | xargs -n 1)
echo "${#arr[@]}"
for i in "${arr[@]}"; do
echo "$i"
done
done
Выход:
4
a
b
c
d e
Однако следующий data.in
:
"a\"b" c
не сможет его (и любой другой сценарий, у меня есть найденных до настоящего времени, даже в dup question):
xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option
Но этот вход является законным, потому что вы можете ввести в командной строке:
echo "a\"b" c
И это хорошо работает. Так что это несоответствие в поведении, а не незаконный ввод.
Правильный ответ здесь заключается в использовании 'xargs printf '% s \ 0'' для синтаксического анализа вашей строки в потоке с разделителем NUL, который bash может читать однозначно. ('xargs', когда не использует расширения' -d' или '-0', использует правила разбора, подобные оболочке, для разделения ввода на слова). См., В частности, http://stackoverflow.com/a/31485948/14122 –
Я думаю, что этот вопрос лучше справляется с выражением проблемы в MCVE, чем дубликат, на который он ссылается. +1 для этого. Кроме того, Чарльз, Тим Тоэди. Я бы предложил другой маршрут, если бы этот вопрос был открыт для ответов, кроме вашего. – ghoti
@ghoti, а? Я вообще не ответил на этот вопрос (только комментарий, и вы тоже можете предоставить свои собственные), а связанный вопрос * * открыт. Я был бы рад увидеть там правильный ответ. –