我正在尝试在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 ")
任何解决此问题的提示都将受到赞赏。可能是一个简单的修复!
答案 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解释了更多可能性。