我有这样的代码
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来说,但这是不对的,我知道这一点。我应该怎么做?
答案 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' ) )
语法$( ... )
计算表达式,并且所有围绕所有内容的括号都表示数组。