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

Результатом плавающей точки является Bash целочисленное деление

У меня есть резервная копия script на моем сервере, которая выполняет задания резервного копирования cron, и отправляет мне сводку резервных копий файлов, включая размер нового файла резервной копии. Как часть script, я бы хотел разделить окончательный размер файла на (1024 ^ 3), чтобы получить размер файла в GB, от размера файла в байтах.

Так как bash не имеет вычисления с плавающей запятой, я пытаюсь использовать pipe для bc, чтобы получить результат, однако я нахожусь в тупике на основных примерах.

Я попытался получить значение Pi в масштабе, однако

хотя работает следующее:

~ #bc -l
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
4/3
1.33333333333333333333
22/7
3.14285714285714285714
q
0
quit

Неактивная версия не работает:

#echo $(( 22/7 )) | bc
3

Это работает:

#echo '22/7' | bc -l
3.14285714285714285714

Но мне нужно использовать переменные. Так что это не помогает, что следующее не работает:

#a=22 ; b=7
#echo $(( a/b )) | bc -l
3

Я явно пропустил что-то в синтаксисе для использования переменных в Bash и мог использовать с некоторыми "указателями" то, что я неправильно понял.

Как сказал DigitalRoss, я могу использовать следующее:

#echo $a / $b | bc -l
3.14285714285714285714

Однако я не могу использовать сложные выражения, например:

#echo $a / (( $b-34 )) | bc -l
-bash: syntax error near unexpected token `('
#echo $a / (( b-34 )) | bc -l
-bash: syntax error near unexpected token `('
#echo $a / (( b-34 )) | bc -l
-bash: syntax error near unexpected token `('

Может ли кто-нибудь дать мне правильный правильный синтаксис для получения результатов с плавающей запятой со сложными арифметическими выражениями?

4b9b3361

Ответ 1

Просто двойная кавычка (") выражение:

echo "$a / ( $b - 34 )" | bc -l

Затем bash будет расширять переменные $ и игнорировать все остальное, а bc будет видеть выражение с круглыми скобками:

$ a=22
$ b=7
$ echo "$a / ( $b - 34 )" 
22 / ( 7 - 34 )

$ echo "$a / ( $b - 34 )" | bc -l
-.81481481481481481481

Ответ 2

Обратите внимание, что ваш echo $(( 22/7 )) | bc -l фактически делает bash вычислением 22/7, а затем отправляет результат на bc. Следовательно, целочисленный вывод не является результатом bc, а просто вводимым значением bc.

Попробуйте echo $(( 22/7 )), не доведя его до bc, и вы увидите.