Сравнение с плавающей точкой в ​​сценарии оболочки - PullRequest
19 голосов
/ 11 марта 2010

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

key1="12.3"
result="12.2"

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

Ответы [ 7 ]

57 голосов
/ 11 марта 2010

bc ваш друг:

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

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

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

18 голосов
/ 11 марта 2010

bash не делает поплавки, используйте 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

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

6 голосов
/ 07 июня 2013

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

if ((`bc <<< "10.21>12.22"`)); then echo "true"; else echo "false"; fi
4 голосов
/ 29 ноября 2012

Использование 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 уже использует значение выхода.

1 голос
/ 29 марта 2017
### The funny thing about bash is this:
> AA=10.3
> BB=10.4
### It needs `$` for compare
> [[ $AA > $BB ]] && echo Hello
> [[ $AA < $BB ]] && echo Hello
Hello

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

0 голосов
/ 11 февраля 2019

Я использовал bc до сих пор, я обнаружил, что в некоторых дистрибутивах не было установлено bc, и я не хотел проходить через sudo apt install bc, но там был python. Использование python:

  if python -c "import sys; sys.exit(0 if float($float_1) > float($float_2) else 1)"; 
    then
    echo "true"
         else
           echo "false"
  fi
0 голосов
/ 10 августа 2017

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

if (( $(awk 'BEGIN {print ("'$result'" <= "'$key1'")}') )); then
    echo "true"
else
    echo "false"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...