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출력합니다 . 우리는 이를 따라 사용할 수 있는 올바른 반환 코드를 설정합니다 .10grep -q 1if

또한 bash 지원 elifelse if.if-then-else-fi

답변2

나는 if'을(를) 싫어합니다. 따라서 피할 수 있다면 다음과 같이 하세요.

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를 반환합니다. 이는 기호 배열을 색인화하는 데 사용됩니다.

관련 정보