bash中的整数比较中的错误

时间:2013-01-08 16:12:19

标签: linux bash integer comparison

我正在尝试在bash中执行一个简单的整数比较,我是新手,我的方法导致错误。任何建议将不胜感激。

我的基本逻辑是我在飓风轨道上阅读。同一track_id可能有多个条目,具有不同的压力值。我想要做的是每个track_id只存储一个条目到数组track_id_poly;压力最低的情况。所以我循环遍历每一行,并尝试将当前压力(对于$ int)与之前的轨道压力($ int - 1)进行比较,如果它较低,则用新的较低压力替换先前的阵列值。我希望这是有道理的。我的代码如下。

int=0
    while read track_id ppres_inter 
    do
      printf -v pres_inter "%.0f" "$pres_inter"
      echo pressure $pres_inter
      case $int in
      0)
        Track_id_poly[$int]=$track_id
        Pres_inter_poly[$int]=$pres_inter
        ((int=int+1)) ;;
      *)  
       if [[ $track_id == ${Track_id_poly[$int-1]} ]]
       then
         if (( $pres_inter -lt ${Pres_inter_poly[$int-1]} ))
         then
           Track_id_poly[$int-1]=$track_id
           Pres_inter_poly[$int-1]=$pres_inter
         fi
       else  
         Track_id_poly[$int]=$track_id
         Pres_inter_poly[$int]=$pres_inter
         ((int=int+1))
       fi ;;
      esac
    done <$file_poly
    int_poly=$int
    echo Number of polygon crossings from set $i is $int_poly

导致我出问题的一行是$ pres_inter的整数比较。

if (( $pres_inter -lt ${Pres_inter_poly[$int-1]} ))

我收到以下错误:

line 41:  96800 -lt 98759 : syntax error in expression (error token is "98759 ")

任何解决此问题的提示都将受到赞赏。可能是一个简单的修复!

3 个答案:

答案 0 :(得分:4)

((...))运算符不接受与test[..][[...]]命令相同的语法。要比较((...))中的两个数字,您可以使用实际的><符号:

$ (( 4 > 2 )) && echo '4 is bigger!'
4 is bigger!

有关详细信息,请参阅ARITHMETIC EVALUATION手册页的bash(1)部分(或here)。

答案 1 :(得分:0)

我的shell脚本生锈是有原因的,但您可以查看该行并使用“[[]]”代替“(())”,或使用“&lt;”而不是“-lt”。见bash: double or single bracket, parentheses, curly braces

但是,我给你的主要提示是停止使用bash来处理除简单程序调用之外的任何事情并切换到脚本语言(Perl,Python,...),因为它不仅仅是更强大,完成工作会更容易,而且运行速度也会更快。

答案 2 :(得分:-2)

在bash中“((表达式))”被不同地评估。所以你不能使用运算符“-lt”,而是可以使用普通运算符&lt;。

有关详细信息,请参阅bash的手册页:

  

((表达))

     

根据规则评估表达式   在算术评估下描述。如果是的价值   表达式非零,返回状态为0;否则返回   状态为1.这与“表达”完全等效。

段落ARITHMETIC EVALUATION解释了更多可能性。