Выполнение простой математики на командной строке с помощью функций удара: 1$ разделен на 2$ (использующий до н.э, возможно)

Вы действительно хотите создать альтернативную установку OpenSSL 1.0.0c и не заменить системные библиотеки. Вы рискуете повреждать значительные части своей системы CentOS путем замены 0.9.8k библиотеки. Лучше всего просто скомпилировать его и установить его в/usr/local/openssl или чем-то подобном.

33
31.01.2012, 16:12
8 ответов

У меня есть удобная вызванная функция удара calc:

calc () {
    bc -l <<< "$@"
}

Использование в качестве примера:

$ calc 65320/670
97.49253731343283582089

$ calc 65320*670
43764400

Можно изменить это для удовлетворения себе. Например:

divide() {
    bc -l <<< "$1/$2"
}

Примечание: <<< здесь строка, которая питается в stdin bc. Вы не должны вызывать echo.

45
27.01.2020, 19:37
  • 1
    я соглашаюсь, что это выглядит лучше без дополнительного добавленного эха, но так как это - встроенная оболочка, это идет с малим ни к какой дополнительной стоимости. То, что мешает мне использовать' <<<' в функциях оболочки, является ее ограничением для избиения, в то время как дополнительное эхо позволяет использовать его в исходной оболочке Bourne или ksh без изменений. аналогичная ситуация –  Tatjana Heuser 31.01.2012, 22:49
  • 2
    @TatjanaHeuser ksh, с 93 вариантами, здесь-строки поддержек. –  Kusalananda♦ 19.04.2017, 19:05
  • 3
    Для присвоения переменной я сделал это: $ foo= (до н.э-l <<<"(2 * 5) + 5") –  thebiggestlebowski 12.02.2018, 15:51

Bash может сделать саму математику в некоторой степени. Это не полезно для точности, тем не менее, поскольку это округляется.

[user]$ echo $(( 10/5 ))
2

Но Вы точно правы - функция удара была бы простым ярлыком, и Ваш пример в основном работает.

divide() {
  echo "scale=25;$1/$2" | bc
}

Бросок, что в Вашем .bashrc и затем Вы можете:

[user]$ divide 10 5
2.0000000000000000000000000
20
27.01.2020, 19:37
  • 1
    echo $((10 / 5)) потребности никакая цитата. –  user unknown 01.02.2012, 01:15
  • 2
    Значительное раздражение: echo $((6383/7671)) даст Вам нуль. Необходимо быть явными о числах с плавающей точкой: echo $((6383.0/7671.0)) –  Sridhar Sarnobat 29.01.2016, 21:39

Вы, вероятно, знаете удар встроенный 'expr' как в

$ expr 60 / 5
12

который ограничен целыми числами и нуждается в пробелах между аргументами.

Что мешает Вам определять функцию вроде выражения эха, которое Вы уже используете? Т.е.

 divide () {
   echo $1/$2 | bc
 }
9
27.01.2020, 19:37
  • 1
    просто незнание. я не понял, что мог заставить его проложить себе путь... –  ixtmixilix 01.02.2012, 22:46

Едва ли ответ на этот точный вопрос, но могло бы быть хорошо знать. Использовать zsh ;-)

% echo $((65320./670))
97.492537313432834
7
27.01.2020, 19:37
  • 1
    я на самом деле искал этот вопрос, потому что я изменился на zsh и не мог использовать удар expr встроенный, так хороший ответ невнимательный :) –  Steen Schütt 16.08.2017, 20:12

Если Вы имеете calc установленный в Вашей системе и Вам не нравится округляться, Вы можете:

div() { calc "$1 / $2"; }
2
27.01.2020, 19:37
  • 1
    хм... не мог найти, что любой debian пакет для 'calc' –  ixtmixilix 31.01.2012, 19:12
  • 2
    Пакет называют apcalc (Точность Arbitary)... Двоичный файл называют calc –  Peter.O 31.01.2012, 19:37
  • 3
    @Peter. O хорошо, в Дуге Linux repos это называют calc. –   31.01.2012, 20:06

Вместо того, чтобы использовать до н.э, Вы могли использовать awk:

div() { awk -v p=$1 -v q=$2 'BEGIN{print p/q}'; }
0
27.01.2020, 19:37

Грязный взлом для маленьких значений и ограниченной точности, не используя до н.э был бы, чтобы умножить предлагающее кандидата лицо перед подразделением, получить точный результат.

Пример без точности:

echo $((13/7)) 
1

и с 2 точностью цифр: умножьтесь на 100 и переместите десятичную точку 2 шага налево:

echo $((100*13/7)) | sed 's/..$/.&/'
1.85
echo $((100*13/7))%
185%

Это только полезно, если диапазон чисел известен прежде, и точность всегда является тем же. Предотвращение звонить до н.э и вызов sed кажутся не очень разумными.

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

echo $((1000000000*12345678901))
-6101065172709551616
2
27.01.2020, 19:37
  • 1
    Используя двойные круглые скобки для оценки математических выражений удерживается от использования. Используйте: $[expression] вместо этого –  laebshade 07.02.2012, 01:06
  • 2
    @laebshade: Я могу доказать Вас неправильно, противоположное верно. Вот цитата руководства удара: The old format $[expression] is deprecated and will be removed in upcoming versions of bash. –  user unknown 07.02.2012, 23:29
echo Division
efgh=$num1/$num2
remainder=$num1%num2
echo $num1 "/" $num2 "=" $efgh.$remainder
echo
-4
27.01.2020, 19:37

Теги

Похожие вопросы