March 10th, 2011

nepal

почти пятничное, бессмысленное и беспощадное

Зашёл тут разговор об использовании командной строки в качестве калькулятора. Я, например, привычно пользуюсь gcc:

$ gdb
GNU gdb (GDB) Fedora (7.2-46.fc14)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
.
(gdb) p 12*5
$1 = 60


Если арифметика целочисленная, то вполне подойдёт встроенная в шелл арифметика. Для обычного шелла это выглядит так:
$ let x=12*5; echo $x
60


А на баше можно скруглить углы:
$ echo $((12*5))
60


Можно, в общем-то, и на awk написать:
$ awk 'BEGIN {print 12*5}'
60


Конечно же, так же подойдёт любой скриптовый язык -- Perl, Python, похапэPHP, Ruby и так далее.

К примеру, вот вам Python:
$ python
Python 2.7 (r27:82500, Sep 16 2010, 18:02:00)
[GCC 4.5.1 20100907 (Red Hat 4.5.1-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 12*5
60


Или проще:
$ echo 'print 12*5' | python -
60


А вот Perl, для данного случая -- никакой разницы, только Перл не добавляет перевод строки :)
$ echo 'print 12*5,"\n"' | perl -
60


А вот PHP, тоже надо добавлять перевод строки:
php -r 'print 12*5 ."\n";'
60


Пример на Ruby оставлю читателям в качестве домашнего задания.
$echo 'print 12*5,"\n"' | ruby
60


А вот особый шик -- на MySQL (полагаю, Postgres тоже вполне подойдёт). Только нужно, чтобы сервер был запущен. Клиент-серверный калькулятор, не хухры-мухры!

$ echo "SELECT 12*5;" | mysql
12*5
60


Ну и, конечно, никто не мешает нам взять и поступить как взрослые бородатые дядьки, а именно написать сразу на С, скомпилировать и запустить. Минимальный вариант примерно такой:
$ echo 'void main(void) {printf("%d\n", 12*5);}' > m.c
$ gcc m.c && ./a.out
m.c: In function ‘main’:
m.c:2:1: warning: incompatible implicit declaration of built-in function ‘printf’
60


Да, очень просится пример на постскрипте, и ведь в принципе несложно сделать, только для того, чтобы увидеть циферку, нужен принтер или просмотровщик PS файлов -- не очень практично. Да и не совсем это уже командная строка получается. Впрочем, я сделал пример на постскрипте, но показывать вам пока не буду.

Пишите в комментах ваши варианты использования командной строки в качестве калькулятора! Наверняка я многое пропустил!