linux - Целочисленное сложение в оболочке




bash shell (6)

Вот мой простой шелл-код. Я хочу, чтобы результат был 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

https://code.i-harness.com


@tonio; пожалуйста, не рекомендуйте использовать конструкции 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. Я допускаю, что пример, который я использовал, был преувеличенным, с явным требованием обойти все встроенные модули, но я думаю, что смысл был сделан: создание новые процессы являются дорогостоящими, избегайте их, когда можете, и знайте, что ваша оболочка распознает, где создаются новые процессы.



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

num=$[num+1]

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

((num++))

Это лучшее / более элегантное решение. Посмотрите ответ собачьей страхи за это.

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

for i in `seq 1 10`; do
   echo $i
done

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

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

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

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; }

попробуй это

$ num=1; num=`expr $num + 1`; echo $num;




shell