Целочисленное сложение в оболочке - PullRequest
17 голосов
/ 04 января 2012

Вот мой простой код оболочки. Я хочу, чтобы результат был 2.Shell обрабатывает все как строку. Как я могу это сделать?

num=1
num=$(( $num + 1 ))

РЕДАКТИРОВАТЬ:

Полный код: что в этом плохого, если я хочу напечатать от 1 до 10?

#! /bin/bash

num=1
until test $num -eq 10
do
    num=$(( $num + 1 ))
    echo $num
done

Ответы [ 9 ]

13 голосов
/ 04 января 2012

В bash вам не нужно делать ничего особенного:

aix@aix:~$ num=1
aix@aix:~$ num=$(( $num + 1 ))
aix@aix:~$ echo $num
2
3 голосов
/ 04 января 2012

@ Тонио; пожалуйста, не рекомендуйте использовать конструкции subshell (`... или $ (...)), когда они не нужны (чтобы избежать путаницы с максимумом, $ ((...)) не является конструкцией sub-shell ). Подоболочки могут нанести огромный удар по производительности даже при довольно тривиальных объемах данных. То же самое верно для каждого места, где внешняя программа используется для создания чего-то, что может быть сделано со встроенной оболочкой.

Пример:

    num=1
    time while [[ $num -lt 10000 ]]; do
            num=$(( num+1 ))
    done
    echo $num
    num=1
    time while /bin/test $num -lt 10000; do
            num=$( /bin/expr $num + 1 )
    done
    echo $num

Вывод (запускается в ksh в Linux):

real    0m0.04s
user    0m0.04s
sys     0m0.01s
10000

real    0m20.32s
user    0m2.23s
sys     0m2.92s
10000

... таким образом, коэффициент времени выполнения 250 и коэффициент времени процессора 100. Я допускаю, что пример, который я использовал, был преувеличенным, с явным требованием обойти все встроенные модули, но я думаю, что смысл made: создание новых процессов обходится дорого, избегайте его, когда можете, и знайте, что ваша оболочка распознает, где создаются новые процессы.

1 голос
/ 04 января 2012

Это может работать для вас:

num=1; ((num++)); echo $num
2

или

num=1; echo $((++num))
2

для петель

for num in {1..10}; do echo $num; done

или (по крайней мере, в bash)

for ((num=1; num<=10; num++)) { echo $num; }

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

for (( num=1,mun=10; num<=10; num++,mun--)) { echo $num $mun; }
1 голос
/ 04 января 2012

Вы только что сделали:

$ num=1; num=$(( $num + 1 ));echo $num
2

Примечание : вам не нужно заключать переменные в кавычки $(( )).Также вы можете просто использовать $((num++))

0 голосов
/ 04 января 2012

Вы не указываете, какую оболочку вы используете, но самая краткая форма, которую я знаю, это эта (работает по крайней мере в bash):

num=$[num+1]

Если только увеличивать на единицу и изменять саму переменную, а не печатать / присваивать, то:

((num++))

Это лучшее / более элегантное решение. См. Ответ на этот вопрос.

Если зациклить значения, я бы использовал эту форму вместо:

for i in `seq 1 10`; do
   echo $i
done
0 голосов
/ 04 января 2012

Вы можете использовать что-то вроде:

num=1
num=`expr $num + 1`

Это также будет работать с оболочками не bash, как ksh.

0 голосов
/ 04 января 2012

Используйте ((num++)) как сокращение для увеличения num.

$ num=1
$ ((num++))
$ echo $num
2
0 голосов
/ 04 января 2012

попробуйте

$ num=1; num=`expr $num + 1`; echo $num;
0 голосов
/ 04 января 2012

работает для меня

$ num=1
$ num=$(( $num + 1 ))
$ echo $num
2

Какой вывод вы получаете?

Подробнее о bash Арифметика @ tldp

РЕДАКТИРОВАТЬ

Чтобы сделать что-то 10 раз в bash, вы можете использовать (используя brace-extension }

$ for i in {1..10}; do echo $i; done
1
2
3
4
5
6
7
8
9
10

Однако вы не можете использовать переменные между {}. Если этовместо этого используйте seq.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...