在循环内调用程序

时间:2014-10-12 18:38:15

标签: bash

我有这样的代码

 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

有了这个,我可以轻松地将输出设置为数组

 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来说,但这是不对的,我知道这一点。我应该怎么做?

1 个答案:

答案 0 :(得分: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' ) )

语法$( ... )计算表达式,并且所有围绕所有内容的括号都表示数组。