Я пытаюсь разделить две ширины изображения в скрипте Bash, но Bash дает мне 0
в результате:
RESULT=$(($IMG_WIDTH/$IMG2_WIDTH))
Я изучил руководство по Bash и знаю, что должен использовать bc
во всех примерах в Интернете, которые они используют bc
. Вecho
Я пытался поставить такую же вещь в моей , SCALE
но это не сработало.
Вот пример, который я нашел в уроках:
echo "scale=2; ${userinput}" | bc
Как я могу получить Bash, чтобы дать мне как поплавок 0.5
?
bash
floating-point
arithmetic-expressions
Medya Gh
источник
источник
Ответы:
Ты не можешь bash делает только целые числа; Вы должны делегировать такие инструменты, как
bc
.источник
VAR=$(echo "scale=2; $IMG_WIDTH/$IMG2_WIDTH" | bc)
илиVAR=$(bc <<<"scale=2;$IMG_WIDTH/$IMG2_WIDTH")
без $ (()) (двойные скобки); который расширяется с помощью bash перед выполнением командыты можешь сделать это:
ОБНОВЛЕНИЕ
20130926
: вы можете использовать:источник
bc -l <<< 'scale=2; 100/3'
Unless specifically mentioned the scale of the result is the maximum scale of the expressions involved.
что для/
оператора есть дополнительная заметка :The scale of the result is the value of the variable scale.
bc <<< 'scale=1; 1*3.00001'
шкала действительно 5 по какой-то причине,bc <<< 'scale=1; 1/3.000001'
шкала 1. Интересно, что деление на 1bc <<< 'scale=1; 1*3.00001/1'
удар
Как отмечалось другими,
bash
не поддерживает арифметику с плавающей запятой, хотя вы можете подделать ее с помощью некоторого фиксированного десятичного трюка, например, с двумя десятичными знаками:Вывод:
Смотрите ответ Нильфреда для аналогичного, но более краткого подхода.
альтернативы
Помимо упомянутых
bc
иawk
альтернатив есть также следующее:CLISP
с убранным выходом:
или через стандартный ввод:
Округ Колумбия
гений кли калькулятор
Ghostscript
Gnuplot
JQ
Или:
КШ
Lua
или через стандартный ввод:
максима
с убранным выходом:
узел
октава
Perl
python2
python3
р
с убранным выходом:
Рубин
Wcalc
С убранным выходом:
ЗШ
единицы
С компактным выходом:
Другие источники
Стефан Шазелас ответил на аналогичный вопрос в Unix.SX.
источник
echo 1/3 | node -p
коротко.Немного улучшив ответ Марвина:
bc не всегда поставляется как установленный пакет.
источник
exit
предотвращать чтение из входного потока. Я также предлагаю использовать-v
флаги awk для предотвращения синдрома склонности зубочистки. Итак:RESULT=$(awk -v dividend="${IMG_WIDTH}" -v divisor="${IMG2_WIDTH}" 'BEGIN {printf "%.2f", dividend/divisor; exit(0)}')
RESULT=$(awk '{printf("result= %.2f\n",$1/$2)}' <<<" $IMG_WIDTH $IMG2_WIDTH "
.bc
является частью POSIX, он обычно предустановлен.Вы можете использовать bc по
-l
опции (буква L)источник
-l
мою систему, bc не выполняет математику с плавающей запятой.В качестве альтернативы bc вы можете использовать awk в вашем скрипте.
Например:
Выше "% .2f" сообщает функции printf возвращать число с плавающей запятой с двумя цифрами после запятой. Я использовал echo для передачи переменных как полей, так как awk работает с ними корректно. «$ 1» и «$ 2» относятся к первому и второму полям, вводимым в awk.
И вы можете сохранить результат как некоторую другую переменную, используя:
источник
Это идеальное время, чтобы попробовать zsh, (почти) суперсет bash, с множеством дополнительных полезных функций, включая математику с плавающей запятой. Вот как будет выглядеть ваш пример в zsh:
Этот пост может вам помочь: bash - Стоит ли переходить на zsh для повседневного использования?
источник
Что ж, до float было время, когда использовалась логика с фиксированными десятичными числами:
Последняя строка - bashim, если не используете bash, попробуйте этот код:
Обоснование кода: умножить на 100 перед делением, чтобы получить 2 десятичных знака.
источник
Если вы нашли вариант вашего предпочтения, вы также можете включить его в функцию.
Здесь я оборачиваю некоторый bashism в функцию div:
Один лайнер:
Или многострочный:
Теперь у вас есть функция
и использовать его как
ОБНОВИТЬ Я добавил небольшой скрипт, который предоставляет вам основные операции с числами с плавающей запятой для bash:
Использование:
А вот и скрипт:
источник
local _d=${3:-2}
прощеЭто не совсем с плавающей точкой, но если вам нужно что-то, что устанавливает более одного результата в одном вызове bc ...
вычисляет площадь и диаметр круга, радиус которого указан в $ 1
источник
Существуют сценарии, в которых вы не можете использовать bc, потому что он может просто не присутствовать, как в некоторых урезанных версиях busybox или встроенных системах. В любом случае ограничение внешних зависимостей - это всегда хорошая вещь, поэтому вы всегда можете добавить нули к числу, деленному на (числитель), что равносильно умножению на степень 10 (вы должны выбрать степень 10 в соответствии с точность, которая вам нужна), которая сделает вывод деления целым числом. Получив это целое число, обработайте его как строку и поместите десятичную точку (перемещая ее справа налево) число раз, равное десятичной степени, на которую вы умножили числитель. Это простой способ получения результатов с плавающей запятой, используя только целые числа.
источник
Хотя вы не можете использовать деление с плавающей запятой в Bash, вы можете использовать деление с фиксированной запятой. Все, что вам нужно сделать, это умножить ваши целые числа на степень 10, а затем разделить целую часть и использовать операцию по модулю, чтобы получить дробную часть. Округление по мере необходимости.
источник
я знаю, что он старый, но слишком заманчивый. Итак, ответ: вы не можете ... но вы можете. давайте попробуем это:
Таким образом, вы получаете 2 цифры после точки, усеченные (назовите это округлением до нижнего значения, хаха) в чистом bash (не нужно запускать другие процессы). конечно, если вам нужна только одна цифра после точки, вы умножаете на 10 и делаете по модулю 10.
что это делает:
Бонусный трек : bc version x 1000 занял 1,8 секунды на моем ноутбуке, а чистый bash - 0,016 секунды.
источник
Как сделать вычисления с плавающей точкой в Bash:
Вместо использования " здесь строки » (
<<<
) сbc
командой, как это делает один из примеров с наибольшим количеством голосов , вот мой любимыйbc
пример с плавающей запятой прямо изEXAMPLES
раздела справочныхbc
страниц (см.man bc
справочных страниц Справочные страницы).Прежде чем мы начнем, знает , что уравнение для пи является:
pi = 4*atan(1)
.a()
нижеbc
математическая функция дляatan()
.Это как сохранить результат вычисления с плавающей запятой в переменную bash - в данном случае в переменную
pi
. Обратите внимание, чтоscale=10
в этом случае количество десятичных знаков точности устанавливается равным 10. Любые десятичные цифры после этого места усекаются .Теперь, чтобы иметь единственную строку кода, которая также печатает значение этой переменной, просто добавьте
echo
команду в конец в качестве последующей команды, как показано ниже. Обратите внимание на усечение в 10 десятичных разрядов, как приказано:Наконец, давайте добавим некоторое округление. Здесь мы будем использовать
printf
функцию для округления до 4 десятичных знаков. Обратите внимание, что3.14159...
раундов сейчас3.1416
. Поскольку мы округляем, нам больше не нужно использоватьscale=10
усечение до 10 десятичных знаков, поэтому мы просто удалим эту часть. Вот конечное решение:Вот еще одно действительно отличное приложение и демонстрация вышеперечисленных методов: измерение и печать во время выполнения.
Обратите внимание, что
dt_min
округляется от0.01666666666...
до0.017
:Связанный:
источник
Используйте Calc. Это самый простой пример, который я нашел:
источник
Для тех, кто пытается рассчитать проценты с принятым ответом, но теряет точность:
Если вы запустите это:
Вы получаете
99.00
только то, что теряет точность.Если вы запустите это так:
Теперь вы получаете
99.99
.Потому что вы масштабируете только в момент печати.
Обратитесь сюда
источник
** Безопасная для инъекций математика с плавающей запятой в bash / shell **
Примечание. Основное внимание в этом ответе уделяется идеям безопасного инъекционного решения для выполнения математических операций в bash (или других оболочках).Конечно, то же самое можно использовать с незначительной настройкой для выполнения расширенной обработки строк и т. Д.
Большинство решений, которые были представлены, конструируют небольшие скриптлеты на лету, используя внешние данные (переменные, файлы, командная строка, переменные среды). Внешний ввод может быть использован для внедрения вредоносного кода в движок, многие из них
Ниже приведено сравнение использования различных языков для выполнения базовых математических вычислений, где результат с плавающей запятой. Он рассчитывает A + B * 0,1 (как с плавающей запятой).
Все попытки решения избежать создания динамических скриптлетов, которые крайне сложно поддерживать, вместо этого они используют статическую программу и передают параметры в назначенную переменную. Они будут безопасно обрабатывать параметры с помощью специальных символов - уменьшая вероятность внедрения кода. Исключением является «BC», который не предоставляет средства ввода / вывода.
Исключением является 'bc', который не обеспечивает никакого ввода / вывода, все данные поступают через программы в stdin, а весь вывод поступает в stdout. Все расчеты выполняются в песочнице, что не допускает побочных эффектов (открытие файлов и т. Д.). Теоретически, инъекция безопасна по конструкции!
источник
python3 -c 'import sys ; *a, = map(float, sys.argv[1:]) ; print(a[0] + a[1]*0.1 + a[2])' "$A" "$B"
"4200.0" ==> 4205.63вот команда awk: -F = разделитель полей == +
источник