Страница 1 из 1

Сложение в командной строке

Добавлено: 2010-05-17 8:13:15
sav
Если спрашивали, извините, не нашел.

в bash есть возможность сложения в командной строке:

Код: Выделить всё

$ $((1+1))
-bash: 2: команда не найдена
а sh меня посылает и пишет

Код: Выделить всё

Неверное имя переменной.
Подскажите пожалуйста, как провернуть такое сложение в sh?

Re: Сложение в командной строке

Добавлено: 2010-05-17 8:34:05
Reiser
Как минимум в http://www.lissyara.su/doc/programming/shell/ было про арифметические операции. Прямо команду не помню.

Re: Сложение в командной строке

Добавлено: 2010-05-17 8:45:54
terminus

Код: Выделить всё

echo $((1+1))
:Search:

Re: Сложение в командной строке

Добавлено: 2010-05-17 8:56:04
sav

Код: Выделить всё

# echo $((1+1))
Неверное имя переменной.
2 Reiser
Спасибо, нашел
примерно то что надо

Код: Выделить всё

# `expr 20 + 1`
21: Команда не найдена.

Re: Сложение в командной строке

Добавлено: 2010-05-17 14:19:44
Гость
sav писал(а):а sh меня посылает и пишет

Код: Выделить всё

Неверное имя переменной.
Подскажите пожалуйста, как провернуть такое сложение в sh?
оно работает и в ash (в freebsd он называется /bin/sh). Ты сначала его запусти. Наверное, по дефолту сидишь в tcsh, вот тя он и посылает.

Re: Сложение в командной строке

Добавлено: 2010-05-23 12:08:01
Reiser
Потому что надо

Код: Выделить всё

echo `expr 20 + 1`
, а команды 21 он действительно не знает.

Re: Сложение в командной строке

Добавлено: 2010-05-23 18:12:31
Гость
expr это внешняя команда, let/exp - внутренние

Код: Выделить всё

> sh
$ type expr let exp
expr is /bin/expr
let is a shell builtin
exp is a shell builtin
$ echo $((1+1))
2
$ let 1+1
2
$ while [ $((i+=1)) -le 10 ]; do echo $i; done
1
2
3
4
5
6
7
8
9
10
на вызов внешних команд расходуется больше ресурсов

Код: Выделить всё

$ sh -c 'while [ ${i:=1} -le 9999 ]; do i=`expr $i + 1` ;echo $i; done >/dev/null; times'
0m0.151s 0m1.000s
0m2.683s 0m7.726s

$ sh -c 'while [ $((i+=1)) -le 9999 ]; do echo $i; done >/dev/null; times'
0m0.046s 0m0.015s
0m0.000s 0m0.000s

$ sh -c 'for i in $(jot - 1 9999); do echo $i; done >/dev/null; times'
0m0.014s 0m0.000s
0m0.004s 0m0.000s
разница заметна? jot(1) тоже внешняя команд, но она может быть эффективнее в качестве простого счетчика с большим кол-вом елементов. Для маленкого кол-ва перевес лишниго форка будет легче заметен.