2014-01-16 2 views
1

У меня есть этот скрипт:Как заставить команду чтения правильно разобрать аргументы массива в кавычках?

#!/usr/bin/env bash 

read -p "Provide arguments: " -a arr <<< "foo \"bar baz\" buz" 
for i in ${arr[@]} 
do 
    echo $i 
done 

который неправильно выводит:

foo 
"bar 
baz" 
buz 

Как я могу сделать это интерпретировать пользовательский ввод, так что параметры в кавычки бы один элемент массива? Как это:

foo 
bar baz 
buz 

EDIT: Чтобы было ясно: я не хочу пользователю вводить каждый элемент в отдельной строке, так read -ную в цикле не то, что я ищу.

+0

Я думал делать 'IFS = ""; read -p "Предоставить аргументы:" -a arr <<< "$ var" 'и иметь новую строку между каждым элементом, но она не работает на меня. – fedorqui

+0

Если вы используете _reading_ вход от STDIN, единственная опция, похоже, вводится с использованием разделителя, например. 'foo; bar baz; buz'. – devnull

+0

Хорошо, но как? 'Предоставить аргументы: foo; бар-баз; buz' тоже не работает. Он читает 'foo;' (с двоеточием) как один элемент. 'GNU bash, версия 4.2.25 (1) -release (x86_64-pc-linux-gnu)'. –

ответ

2

Вам лучше подавать пользовательский ввод с использованием другого разделителя, например. ;.

OLDIFS=$IFS 
IFS=$';' 
read -p "Provide arguments: " -a var 
for i in "${!var[@]}" 
do 
    echo Argument $i: "${var[i]}" 
done 
IFS=$OLDIFS 

При исполнении:

Provide arguments: foo;bar baz;buz 
Argument 0: foo 
Argument 1: bar baz 
Argument 2: buz 

Plus модификации для подрезки переменные:

echo Argument $i: $(echo "${var[i]}" | sed -e 's/^ *//g' -e 's/ *$//g') 
+0

Хорошо, я могу согласиться на это. Спасибо :) Только одна модификация: обрезка из [этого ответа] (http://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-bash-variable). –

+1

Ницца; вы можете сделать 'IFS = $ ';' read ... '(в той же строке, где локализуется' 'IFS'' для этой команды), и в этом случае нет необходимости сохранять и восстанавливать' $ IFS' через '$ OLDIFS'. – mklement0

Смежные вопросы