2014-10-12 4 views
2

У меня есть код, как этотВызов программы внутри цикла

Alien=(misterX 3010 6400 9920 12750 3010 6400 9920 12750 9920) 
Opponent=(misterY 3090 6450 10020 12820 10020 12820 3090 6450 9910) 

for ((y=1 ; y<${#Alien[@]} ; y++)); do 
    echo "scale=2;(${Opponent[$y]}-${Alien[$y]})/1000" | bc | sed -e 's/^\./0./g' -e 's/^-\./-0./g' 

done 

С этим я могу Исли Asign выход на массив

for ((y=1 ; y<${#Alien[@]} ; y++)); do 
    Wynik+=($(echo "scale=2;(${Opponent[$y]}-${Alien[$y]})/1000" | bc | sed -e 's/^\./0./g' -e 's/^-\./-0./g')) 

done 

echo ${Wynik[@]} 

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

(
echo "scale=2;" 
for ((y=1 ; y<${#Alien[@]} ; y++)); do 
    echo "(${Opponent[$y]}-${Alien[$y]})/1000" 

done 
) | bc | sed -e 's/^\./0./g' -e 's/^-\./-0./g' 

Частично я понимаю, как это работает, но не может найти способ перемещения вывода в массив. Единственный способ, который я нашел, -

(
echo "scale=2;" 
for ((y=1 ; y<${#Alien[@]} ; y++)); do 
    echo "(${Opponent[$y]}-${Alien[$y]})/1000" 

done 
) | bc | sed -e 's/^\./0./g' -e 's/^-\./-0./g' > filename 
Wynik+=($(cat filename)) 

echo ${Wynik[@]} 

Еще быстрее, по крайней мере, для ssd, но это не так, я знаю это. Как я должен это делать?

ответ

0

Оберните свое выражение в ($(...)) и назначьте его переменной.

Wynik=($((
echo "scale=2;" 
for ((y=1 ; y<${#Alien[@]} ; y++)); do 
    echo "(${Opponent[$y]}-${Alien[$y]})/1000" 
done 
) | bc | sed -e 's/^\./0./g' -e 's/^-\./-0./g')) 

Синтаксис $(...) это оценивает выражение и дополнительную пару скобок вокруг все обозначающих массив.

+0

Отлично, спасибо. –

+0

@kicha__ Пожалуйста, примите ответ, если он вам поможет. Благодарю. – plesiv

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