LINUX.ORG.RU

Bash и Let

 , let


1

2

В общем я делаю арифметические расчеты в скрипте с помощью let, но в ответе получаю только целые числа, а мне нужно чтобы ответ был в десятичной дроби. То есть выводит 1, когда ответ 1,0054 к примеру. Возможно ли это как нибудь сделать?

★★

Шёл 2013й год, а в баш всё ещё не было поддержки арифметики с плавающей запятой...
Используй другой шелл

zolden ★★★★★
()
$ echo "s(3.1415926)" | bc -l
.00000005358979323846

и да, в bash удобнее юзать не let, а (( ))

$ X=123
$ (( X++ ))
$ echo $X
124

drBatty ★★
()
Ответ на: комментарий от zolden

а в баш всё ещё не было поддержки арифметики с плавающей запятой...

зачем оно нужно? Существует Over9000 разнообразных ЯП, тот же bc например

на нём тоже можно писать программы, например

   The following is code that uses the extended features of `bc' to
implement a simple program for calculating checkbook balances.  This
program is best kept in a file so that it can be used many times
without having to retype it at every use.


     scale=2
     print "\nCheck book program\n!"
     print "  Remember, deposits are negative transactions.\n"
     print "  Exit by a 0 transaction.\n\n"

     print "Initial balance? "; bal = read()
     bal /= 1
     print "\n"
     while (1) {
       "current balance = "; bal
       "transaction? "; trans = read()
       if (trans == 0) break;
       bal -= trans
       bal /= 1
     }
     quit

   The following is the definition of the recursive factorial function.


     define f (x) {
       if (x <= 1) return (1);
       return (f(x-1) * x);
     }

drBatty ★★
()
Ответ на: комментарий от drBatty

зачем оно нужно?

Как сам оцениваешь, насколько у тебя хорошо с логикой?
Давай, просто с точки зрения логики подумаем, почему есть арифметика с целыми числами (зачем оно нужно, если есть bc?), а с плавающей запятой нет?
Есть такое понятие, как консистентность, или единообразие поведения системы.
Мне вот, допустим, текущая реализация кажется просто нелогичной.
А по твоей логике так и целочисленная арифметика не нужна.

zolden ★★★★★
()
Ответ на: комментарий от zolden

А по твоей логике так и целочисленная арифметика не нужна.

понимаешь, любой инструмент делается не просто так, а с какой-то целью. Цель shell - писать системные скрипты, которые выполняют несложные административные задачи. Для других целей есть другие ЯП.

Вот ты мне и расскажи, зачем при целевом использовании shell нужна арифметика с плавающей точкой? А то, лично я - не понимаю.

(тем не менее, арифметика в bash вообще конечно нужна. Администратор может например посчитать юзеров и/или какие-то их ресурсы. Однако целых чисел для этого в 99% случаев достаточно. Если недостаточно - то bash вообще не для этой задачи).

Есть такое понятие, как консистентность, или единообразие поведения системы.

вот ты не поверишь - в bash есть только один тип данных: строка символов. А ещё несколько костылей, которые рассматривают строки как целые числа. Городить костыли для FP создатели bash'а не решились, он и так тормозит. Напиши например поиск 100500го простого числа на shell и на любом другом ЯП. Вангую, кто будет быстрее.

drBatty ★★
()
Ответ на: комментарий от zolden

Шелл много чего не обязан, но если умеет, то зачем от этого отказываться

Init много чего не обязан, но если есть http сервер, генератор qr-кодов, проигрыватель видео, кофеварка, то зачем от этого отказываться? Добавим всё это в init.

sleepflint ★★★
()
Ответ на: комментарий от sleepflint

зачем, если уже всё добавили.

anonymous
()

Тк bc вполне может и не быть:

$ echo 666 0.5 |awk '{print $1*$2}'
333

tides
()
Ответ на: комментарий от KendovNorok

Русская локаль. Что не понятно?

anonymous
()
Ответ на: комментарий от sleepflint

Юмор смищной. Давай теперь я попробую
Есть /bin/ls и /bin/echo, а давайте ради смеха встроим это в шелл и назовём builtin

zolden ★★★★★
()
Ответ на: комментарий от zolden

Кончай тупить echo используется в каждом скрипте, а FP арифметика в каждом 1000'ном. Так нахрена она там нужна?

anonymous
()
Ответ на: комментарий от Razip

Можно новичку поподробнее? :)

Допустим, ты хочешь узнать, чему равно частное от деления 10 и 2 с точностью до двух знаков после запятой, и записать результат в переменную rslt:

rslt=$(echo 'scale = 2 ; 10 / 2' | bc)
Здесь bc — калькулятор из одноименного пакета, принимающий на stdin выражение и возвращающий в stdout его результат, scale задает точность результата (в данном случае 2 знака после запятой). О том, что еще умеет bc, можно узнать из man bc.

dexpl ★★★★★
()
Ответ на: комментарий от anonymous

Не подсказывай, сейчас я попробую угадать твою логику...
То есть, ты хочешь сказать, что если в каждом твоём скрипте используется какой-то функционал, то его надо дублировать в шелле, скажем, для уменьшение накладных расходов. А если в твоём скрипте что-то используется редко, то дублировать не надо.
Угадал?

zolden ★★★★★
()
Ответ на: комментарий от zolden

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

Не нужна, в том же rc её нет.

quantum-troll ★★★★★
()
Ответ на: комментарий от drBatty

Напиши например поиск 100500го простого числа

Зачем? Чтоб посмотреть, достаточно сравнить это с любым другим ЯП:

for i in {-100000..10000000}; do :; done
Оно весело забьёт 2+ гигабайта памяти, пока будет пытаться высчитать все 11000000 чисел.

P.S. Это я так, сорвалось

nexfwall ★★★★
()
Последнее исправление: nexfwall (всего исправлений: 1)
Ответ на: комментарий от Razip

Наверно весело было смотреть, как один простой вопрос вдруг внезапно превратился в срач? %)

nexfwall ★★★★
()
Ответ на: комментарий от nexfwall

Оно весело забьёт 2+ гигабайта памяти, пока будет пытаться высчитать все 11000000 чисел.

это потому-что у тебя руки из жопы. Сравни

$ time for (( i = -100000; i < 10000000; i++ )); do true; done

real	1m5.103s
user	1m3.951s
sys	0m0.982s
не очень быстро, но никаких «2Гб» тут нет.

P.S. Это я так, сорвалось

у меня тоже.

drBatty ★★
()
Ответ на: комментарий от drBatty

это потому-что у тебя руки из жопы. Сравни

Это уже совсем другой алгоритм. В других языках диапазон чисел ведёт себя адекватно, но не в bash.

nexfwall ★★★★
()
Ответ на: комментарий от zolden

Бог создал целые числа, всё остальное — дело рук человека. (с) Леопольд Кронекер

anonymous
()
Ответ на: комментарий от nexfwall

Это уже совсем другой алгоритм. В других языках диапазон чисел ведёт себя адекватно, но не в bash.

деточка, у тебя диапазон СИМВОЛОВ

Символьная строчка, которую ты пихаешь в for…in, дабы он её порезал на кусочки. Ты ССЗБ.

drBatty ★★
()
8 августа 2013 г.
Ответ на: комментарий от drBatty

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

#!/usr/bin/bc
5*10
quit

Хотел написать калькулятор банковских процентов на bash, чтобы он передавал ввод в bc. Теперь сделаю проще.

Bagrov ★★★★★
()
Последнее исправление: Bagrov (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.