0

我正在尝试在 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 ")

任何解决此问题的提示将不胜感激。可能是一个简单的修复!

4

3 回答 3

5

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

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

有关更多信息,请参见手册页部分(或ARITHMETIC EVALUATION此处bash(1)

于 2013-01-08T16:15:23.470 回答
0

我的 shell 脚本很生锈,但您可以查看该行并使用 "[[ ]]" 代替 "(( ))" 或使用 "<" 代替 "-lt" 。请参阅bash:双括号或单括号、括号、花括号

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

于 2013-01-08T16:27:09.270 回答
-2

在 bash 中,“((表达式))”的评估方式不同。因此,您不能使用运算符“-lt”,而是可以使用普通运算符 <。

有关更多信息,请参见 bash 的手册页:

((表达))

表达式根据下面算术评估中描述的规则进行评估。如果表达式的值为非零,则返回状态为0;否则返回状态为 1。这完全等同于 let "表达式"。

算术评估段落解释了进一步的可能性。

于 2013-01-08T16:25:26.977 回答