0

初めて使用するbashで単純な整数比較を実行しようとしていますが、メソッドがエラーを引き起こしています。アドバイスをいただければ幸いです。

私の基本的な論理は、ハリケーンのトラック ポイントを読んでいるということです。同じ track_id に異なる圧力値を持つ複数のエントリが存在する場合があります。私がやりたいことは、track_id ごとに 1 つのエントリのみを配列 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

演算子は、、、またはコマンド((...))と同じ構文を受け入れません。で 2 つの数値を比較するには、実際のまたは記号を使用します。test[..][[...]]((...))><

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

詳細については、 man ページのARITHMETIC EVALUATIONセクション(またはこちら) を参照してください。bash(1)

于 2013-01-08T16:15:23.470 に答える
0

私のシェルスクリプトは正当な理由で錆びていますが、その行を確認して、「(( ))」の代わりに「[[ ]]」を使用するか、「-lt」の代わりに「<」を使用してください。bashを参照してください: 二重か一重かっこ、かっこ、中かっこ

ただし、私があなたに提供する主なヒントは、単純なプログラムの呼び出しを超えたものに bash を使用するのをやめ、スクリプト言語 (Perl、Python など) に切り替えることです。仕事がやりやすくなり、実行速度も速くなります。

于 2013-01-08T16:27:09.270 に答える
-2

bash では "((expression))" の評価が異なります。そのため、演算子「-lt」を使用することはできません。代わりに、通常の演算子 < を使用できます。

詳細については、bash の man ページを参照してください。

((表現))

式は、算術評価で後述する規則に従って評価されます。式の値がゼロ以外の場合、戻りステータスは 0 です。それ以外の場合、戻りステータスは 1 です。これは let "expression" とまったく同じです。

そして、段落ARITHMETIC EVALUATIONはさらなる可能性を説明しています。

于 2013-01-08T16:25:26.977 に答える