Я пытаюсь сравнить два десятичных значения, но получаю ошибки. Я использовал
if [ "$(echo $result1 '>' $result2 | bc -l)" -eq 1 ];then
как было предложено другим потоком.
Я получаю ошибки.
Каков правильный способ сделать это?
Я пытаюсь сравнить два десятичных значения, но получаю ошибки. Я использовал
if [ "$(echo $result1 '>' $result2 | bc -l)" -eq 1 ];then
как было предложено другим потоком.
Я получаю ошибки.
Каков правильный способ сделать это?
Вы можете сделать это, используя Bash числовой контекст:
if (( $(echo "$result1 > $result2" | bc -l) )); then
bc
будет выводить 0 или 1, а (( ))
будет интерпретировать их как false или true соответственно.
То же самое с помощью AWK:
if (( $(echo "$result1 $result2" | awk '{print ($1 > $2)}') )); then
if awk 'BEGIN{exit ARGV[1]>ARGV[2]}' "$z" "$y"
then
echo z not greater than y
else
echo z greater than y
fi
В ответ на ответ Денниса:
Хотя его ответ правильный для десятичных точек, bash throws (standard_in) 1: синтаксическая ошибка с арифметикой с плавающей запятой.
result1=12
result2=1.27554e-05
if (( $(echo "$result1 > $result2" | bc -l) )); then
echo "r1 > r2"
else
echo "r1 < r2"
fi
Это возвращает неверный вывод с предупреждением, хотя с кодом выхода 0.
(standard_in) 1: ошибка синтаксиса
r1 < г2
Пока нет четкого решения этой проблемы (обсуждение thread 1 и thread 2), я использовал после частичного исправления округлением результатов с плавающей запятой, используя awk
, за которым следует команда bc
, как в ответе Дениса, и этот поток
Завершить до нужного десятичного знака: После этого вы получите рекурсивное пространство в каталоге TB с округлением во втором знаке после запятой.
result2=$(du -s "/home/foo/videos" | tail -n1 | awk '{$1=$1/(1024^3); printf "%.2f", $1;}')
Затем вы можете использовать арифметику bash, как указано выше, или с помощью приложения [[ ]]
, как в следующем потоке.
if (( $(echo "$result1 > $result2" | bc -l) )); then
echo "r1 > r2"
else
echo "r1 < r2"
fi
или с помощью оператора -eq
, где bc
вывод 1 равен true, а 0 - false
if [[ $(bc <<< "$result1 < $result2") -eq 1 ]]; then
echo "r1 < r2"
else
echo "r1 > r2"
fi
if [[ `echo "$result1 $result2" | awk '{print ($1 > $2)}'` == 1 ]]; then
echo "$result1 is greater than $result2"
fi
Вы также можете echo
a if...else
для bc
.
- echo $result1 '>' $result2
+ echo "if (${result1} > ${result2}) 1 else 0"
(
#export IFS=2 # example why quoting is important
result1="2.3"
result2="1.7"
if [ "$(echo $result1 '>' $result2 | bc -l)" -eq 1 ]; then echo yes; else echo no;fi
if [ "$(echo "if (${result1} > ${result2}) 1 else 0" | bc -l)" -eq 1 ];then echo yes; else echo no; fi
if echo $result1 $result2 | awk '{exit !( $1 > $2)}'; then echo yes; else echo no; fi
)
Невозможно преобразовать силовое преобразование bash? Например:
($result1 + 0) < ($result2 + 0)
Зачем использовать bc?
for i in $(seq -3 0.5 4) ; do echo $i ; if [[ (( "$i" < 2 )) ]] ; then echo "... is < 2";fi; done
Единственная проблема: сравнение "<" не работает с отрицательными числами: они берутся за их абсолютное значение.