BASH 比较字符串/整数错误

BASH 比较字符串/整数错误

我正在编写这个脚本来检查定价。它到达第 16 行并抛出一个错误。

#!/bin/bash

echo "   Date        Time     Price"
echo "-----------------------------"
while [ true ]
do

new_price=$(curl -s "https://coinbase.com/api/v1/prices/spot_rate" | jq -r ".amount")

balance=0.000001

if [ -z $current_price ]; then
current_price=0
fi

if [ $current_price < $new_price ]; then
ARROW="+"
else if [ $current_price > $new_price ]; then
ARROW="-"
else
ARROW="="
fi
fi

echo "$(date '+%m/%d/%Y | %H:%M:%S') | $new_price | $ARROW"

current_price=$new_price
sleep 30
done

输出错误

-PC:~/scripts/ticker$ ./arrows.sh
   Date        Time     Price
-----------------------------
./arrows.sh: line 16: 7685.00: No such file or directory
11/17/2017 | 15:45:28 | 7685.00 | -

这是详细的

-PC:~/scripts/ticker$ bash -x ./arrows.sh
+ echo '   Date        Time     Price'
   Date        Time     Price
+ echo -----------------------------
-----------------------------
+ '[' true ']'
++ curl -s https://coinbase.com/api/v1/prices/spot_rate
++ jq -r .amount
+ new_price=7685.00
+ balance=0.000001
+ '[' -z ']'
+ current_price=0
+ '[' 0 ']'
+ ARROW=+
++ date '+%m/%d/%Y | %H:%M:%S'

答案1

代替:

if [ $current_price < $new_price ]; then
ARROW="+"
else if [ $current_price > $new_price ]; then
ARROW="-"
else
ARROW="="
fi
fi

和:

if echo "$current_price < $new_price" | bc | grep -q 1; then
    ARROW="+" 
elif  echo "$current_price > $new_price" | bc | grep -q 1; then
    ARROW="-"
else
    ARROW="="
fi

在 test( [) 中,数值小于比较的运算符-lt不是<。 (这是因为<用于输入重定向。)因此,如果您的价格是整数,您可以使用:

if [ "$current_price" -lt "$new_price" ]; then

但是,您的价格是浮点的,因此我们需要bc或等效的方法进行数学计算。 bc打印1逻辑条件是否为真或0为假。我们按照grep -q 1它设置可以使用的正确返回代码if

另请注意,bash 支持elif提供比else if.最后,许多用户认为缩进使 bash 命令更if-then-else-fi容易阅读。

答案2

我讨厌if's,所以,如果我能避免它们:

arrows=('=' '<' '>')
ARROW=${arrows[$(echo "c=$current_price;n=$new_price;(c<n)+2*(c>n)" | bc)]} 

在慢动作中:c=$current_price;n=$new_price;(c<n)+2*(c>n)如果值相等、更小或更大,则返回 0、1 或 2。这用于索引符号数组。

相关内容