0

所以我在 python 和 bash 中都这样做了,我即将发布的代码可能有很多问题,但它通常是非常基本的,我看不出它会导致我的这个“错误”的原因很快就会解释.. 我在 Python 中做了同样的事情,但更专业和更干净,它也会导致这个错误(在某些时候,数学会生成一个负数,这是没有意义的。)

#!/bin/bash
while [ 1 ];
do

zero=0
ARRAY=()
ARRAY2=()

first=`command to generate a list of numbers`
sleep 1
second=`command to generate a list of numbers`

# so now we have two data sets, 1 second between the capture of each.

for i in $first;
do
ARRAY+=($i)
done

for i in $second;
do
ARRAY2+=($i)
done

for (( c=$zero; c<=${#ARRAY2[@]}; c++ ))
do
expr ${ARRAY2[$c]} - ${ARRAY[$c]}
done

ARRAY=()
ARRAY2=()
zero=0
c=0
first=``
second=``
math=''

done

所以脚本抓取一组数据,等待 1 秒,再次抓取,对两组进行数学运算以获得差异,打印出差异。这很简单,而且我在 Python 中也很优雅地完成了它 - 无论我如何不时地这样做,可能是从 3 个循环到 30 个循环,我们将得到负数.. 像这样:

开始 0 0 0 0 0 19 10 563 0 -34 19 14 2 0 -1302 1198 -532 639 -1078 1119 1 0 0 -843 33 880 0 5 -8 -13508 8773 4541 988 181 -12 -205 217 -9 7 1 -360 303 60 1 0 0 -12 -96 98 3 -870 904 -130 -2105 2264 6 -3084 1576 1650 -939 971 -2249 1150 1281

-693 9 513 142 76 expr:语法错误

请帮忙,我根本找不到任何关于这个的东西。

按要求输出样例:

ARRAY1 OUTPUT
1 15 1 25 25 1 2 1 3541 853 94567 42 5 1 351 51 1 11 1 13 7 14 12 3999 983 5 1938 3 8287 40 1 1 1 5253 706 1 1 1 1 5717 3 50 1 85 100376 17334 4655 1 1345 2 1 16 1777 1 3 38 23 8 32 47 781 947 1 1 206 9 1 3 2 81 2602 7 158 1 1 43 91 1 120 6589 6 2534 1092 1 6014 7 2 2 37 1 1 1 80 2 1 1270 15448 66 1 10238 1 10794 16061 4 1 1 1 9754 5617 1123 926 3 24 10 16
ARRAY2 OUTPUT
1 15 1 25 25 1 2 1 3555 859 95043 42 5 1 355 55 1 11 1 13 7 14 12 4015 987 5 1938 3 8335 40 1 1 1 5280 706 1 1 1 1 5733 3 50 1 85 100877 17396 4691 1 1353 2 1 16 1782 1 3 38 23 8 32 47 787 947 1 1 206 9 1 3 2 81 2602 7 159 1 1 43 91 1 120 6869 6 2534 1092 1 6044 7 2 2 37 1 1 1 80 2 1 1270 15563 66 1 10293 1 10804 16134 4 1 1 1 9755 5633 1135 928 3 24 10 16
START
4

2 回答 2

1

答案就在上面Russell Uhl的评论中。您的循环一次对多次运行(这是您的代码):

for (( c=$zero; c<=${#ARRAY2[@]}; c++ ))
do
        expr ${ARRAY2[$c]} - ${ARRAY[$c]}
done

要修复,您需要将测试条件从更改c <= ${#ARRAY2[@]}c < ${#ARRAY2[@]}

for (( c=$zero; c < ${#ARRAY2[@]}; c++ ))
do
        echo $((${ARRAY2[$c]} - ${ARRAY[$c]}))
done

我还更改了 expr 以使用内置的算术评估$((...))

测试脚本(sum.sh):

#!/bin/bash
zero=0
ARRAY=()
ARRAY2=()

first="1 15 1 25 25 1 2 1 3541 853 94567 42 5 1 351 51 1 11 1 13 7 14 12 3999 983 5 1938 3 8287 40 1 1 1 5253 706 1 1 1 1 5717 3 50 1 85 100376 17334 4655 1 1345 2 1 16 1777 1 3 38 23 8 32 47 7
second="1 15 1 25 25 1 2 1 3555 859 95043 42 5 1 355 55 1 11 1 13 7 14 12 4015 987 5 1938 3 8335 40 1 1 1 5280 706 1 1 1 1 5733 3 50 1 85 100877 17396 4691 1 1353 2 1 16 1782 1 3 38 23 8 32 47

for i in $first; do
    ARRAY+=($i)
done

# Alternately as chepner suggested:
ARRAY2=($second)

for (( c=$zero; c < ${#ARRAY2[@]}; c++ )); do
    echo -n $((${ARRAY2[$c]} - ${ARRAY[$c]})) " "
done

运行它:

samveen@precise:/tmp$ echo $BASH_VERSION
4.2.25(1)-release
samveen@precise:/tmp$ bash sum.sh
0  0  0  0  0  0  0  0  14  6  476  0  0  0  4  4  0  0  0  0  0  0  0  16  4  0  0  0  48  0  0  0  0  27  0  0  0  0  0  16  0  0  0  0  501  62  36  0  8  0  0  0  5  0  0  0  0  0  0  0  6  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  280  0  0  0  0  30  0  0  0  0  0  0  0  0  0  0  0  115  0  0  55  0  10  73  0  0  0  0  1  16  12  2  0  0  0  0

编辑:
* 增加了评论中建议的改进。

于 2013-06-14T16:56:24.260 回答
0

我认为问题必须是当两个数组的大小不同时。很容易重现该语法错误——减号运算符的操作数之一是空字符串:

$ a=5; b=3; expr $a - $b
2
$ a=""; b=3; expr $a - $b
expr: syntax error
$ a=5; b=""; expr $a - $b
expr: syntax error
$ a=""; b=""; expr $a - $b
-

尝试

ARRAY=( $(command to generate a list of numbers) )
sleep 1
ARRAY2=( $(command to generate a list of numbers) )

if (( ${#ARRAY[@]} != ${#ARRAY2[@]} )); then
    echo "error: different size arrays!"
    echo "ARRAY: ${#ARRAY[@]} (${ARRAY[*]})"
    echo "ARRAY2: ${#ARRAY2[@]} (${ARRAY2[*]})"
fi

“只要第一个数组小于第二个数组,就会发生错误”——当然。您正在从 0 循环到 ARRAY2 的数组大小。当 ARRAY 的元素较少时,您最终会尝试访问数组中不存在的索引。当您尝试引用未设置的变量时,bash 会为您提供空字符串。

$ a=(1 2 3)
$ b=(4 5 6 7)
$ i=2; expr ${a[i]} - ${b[i]}
-3
$ i=3; expr ${a[i]} - ${b[i]}
expr: syntax error
于 2013-06-14T19:37:20.743 回答