Сравнение плавающих точек в оболочке Script
Можете ли вы предложить мне синтаксис для сравнения с плавающей запятой в Bash script? В идеале я бы хотел использовать его как часть инструкции if
. Вот небольшой фрагмент кода:
key1="12.3"
result="12.2"
if (( $result <= $key1 ))
then
# some code here
fi
Ответы
Ответ 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