2017-01-11 3 views
1

Я пытаюсь сделать вывод команды прочитанным циклом for, но таким образом, что переменная цикла будет массивом. это возможно? это то, что я пытался до сих пор:bash create for loop с переменной массива

function samplevals() { 
    echo '"aa bb"' 
    echo '"cc dd"' 
    echo '"ee ff" "gg hh"' 
} 

samplevar='"aa bb" 
"cc dd" 
"ee ff" "gg hh"' 

echo call function samplevals: 
for x in `samplevals `; do echo ">$x<"; done 

echo read variable samplevar: 
echo $samplevar 
for x in $samplevar; do echo ">$x<"; done 

echo process output of 'echo samplevar:' 
for x in `echo $samplevar`; do echo ">$x<"; done 

echo "the thing with set" 
for x in $samplevar; do set -- $x ; echo "\$1=>$1<,\$2=>$2<"; done 

но выход всегда одинаков:

>"aa< 
>bb"< 
>"cc< 
>dd"< 
>"ee< 
>ff"< 
>"gg< 
>hh"< 

Могу ли я каким-то образом предотвратить Баш от разделения элементов на более мелкие куски?

это то, что я пытался до сих пор: http://www.tutorialspoint.com/execute_bash_online.php?PID=0Bw_CjBb95KQMa295ZV84dkg4ME0

+0

Кавычки - это буквальные данные, а не синтаксические кавычки. В вашем коде нет никаких массивов. – chepner

ответ

0

Способ определения массива в bash является

samplevars=("aa bb" "cc dd" "ee ff" "gg hh") 
for x in "${samplevar[@]}"; do 
    echo ">$x<" 
done 
+0

Я это знаю. но мне нужно использовать другой выход команды. – murison

+1

Существует * простой способ создания массива из вывода команды, потому что в 'bash' нет значения типа * * *, только параметры массива *, синтаксис которых дает вид значений массива. Массив действительно ближе к слабо связанному набору отдельных переменных, связанным вместе с некоторым синтаксическим сахаром. – chepner

1

Вдоль линий chepner's answer, используя read команду. Флаг -a команды позволяет вывести вывод в массив.

IFS=$'\t' read -ra arrayDef < <(echo -ne '"abc def"\t"ghi jkl"') 
for x in "${arrayDef[@]}"; do 
    echo ">$x<" 
done 

Вы можете заменить echo часть с некоторой командой, которая генерирует такую ​​строку. Не забудьте обновить IFS соответственно относительно того, как строка ограничена. В моем случае у меня просто строка, де-ограниченная \t

+0

Это просто сдвигает «разделитель» от произвольного пробела до вкладки. Он не решает основной проблемы наличия разделителя, который * гарантирован * не должен встречаться в элементе массива. – chepner

+0

@chepner: Первоначально это предлагалось как альтернативная дополняющая логика, видя вашу, но видя, что OP не одобряет вашу. Вы хотите, чтобы я удалил его – Inian

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