Подтвердить что ты не робот

Сравнение плавающих точек в оболочке Script

Можете ли вы предложить мне синтаксис для сравнения с плавающей запятой в Bash script? В идеале я бы хотел использовать его как часть инструкции if. Вот небольшой фрагмент кода:

key1="12.3"
result="12.2"

if (( $result <= $key1 ))
then
    # some code here
fi
4b9b3361

Ответ 1

bash не выполняет float, используйте awk

key1=12.3
result=12.5
var=$(awk 'BEGIN{ print "'$key1'"<"'$result'" }')    
# or var=$(awk -v key=$key1 -v result=$result 'BEGIN{print result<key?1:0}')
# or var=$(awk 'BEGIN{print "'$result'"<"'$key1'"?1:0}')
# or 
if [ "$var" -eq 1 ];then
  echo "do something"
else
  echo "result more than key"
fi

есть другие оболочки, которые могут делать float, такие как zsh или ksh, вы также можете попробовать их использовать.

Ответ 2

bc - ваш друг:

key1="12.3"
result="12.2"
if [ $(bc <<< "$result <= $key1") -eq 1 ]
    then
    # some code here
fi

Обратите внимание на немного туманную здесь строку (<<<), как приятную альтернативу echo "$result <= $key1" | bc.

Кроме того, un bash -like bc печатает 1 для true и 0 для false.

Ответ 3

еще один простой способ с помощью bc:

if ((`bc <<< "10.21>12.22"`)); then echo "true"; else echo "false"; fi

Ответ 4

Использование функции exit() awk делает ее почти читаемой.

key1=12.3
result=12.5

# the ! awk is because the logic in boolean tests 
# is the opposite of the one in shell exit code tests
if ! awk "{ exit ($result <= $key1) }" < /dev/null
then
        # some code here
fi

Обратите внимание, что нет необходимости повторно использовать оператор [, поскольку if уже использует значение выхода.

Ответ 5

### The funny thing about bash is this:
> AA=10.3
> BB=10.4
> [[ AA > BB ]] && echo Hello
> [[ AA < BB ]] && echo Hello
Hello

Да, я знаю, что это обман, но это работает. И научная нотация здесь не работает.

Ответ 6

yu может использовать это сравнение awk внутри предложения if, оно будет печатать 1 (true), если условие истинно else 0 (false), и эти значения будут интерпретироваться как логические значения с помощью if

if (( $(awk 'BEGIN {print ("'$result'" <= "'$key1'")}') )); then
    echo "true"
else
    echo "false"
fi