Сравнение с плавающей точкой в сценарии оболочки

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

key1="12.3"
result="12.2"

if (( $result <= $key1 ))
then
    # some code here
fi
19
задан Keith Pinson 27 June 2012 в 17:25
поделиться

2 ответа

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, вы можете попробовать использовать и их

18
ответ дан 30 November 2019 в 01:50
поделиться

bc - ваш друг:

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

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

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

57
ответ дан 30 November 2019 в 01:50
поделиться