Я попытался увеличить числовую переменную, используя оба var=$var+1
и var=($var+1)
без успеха. Переменная - это число, хотя bash, похоже, читает ее как строку.
Выпуск версии 4.2.45 (1) для Bash (x86_64-pc-linux-gnu) в Ubuntu 13.10.
Существует несколько способов увеличить переменную в bash, но то, что вы пробовали, неверно.
Вы можете использовать, например, арифметическое расширение :
var=$((var+1))
((var=var+1))
((var+=1))
((var++))
Или вы можете использовать let
:
let "var=var+1"
let "var+=1"
let "var++"
Смотрите также: http://tldp.org/LDP/abs/html/dblparens.html .
((++var))
или((var=var+1))
или((var+=1))
.var=0; ((var++))
возвращает код ошибки, покаvar=0; ((var++)); ((var++))
нет. Есть идеи почему?help '(('
. В последней строке написано:Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise.
1
поэтому совет @ gniourf_gniourf включает,((++var))
но не включает((var++))
.let var++
без кавычек?Арифметика в Bash использует
$((...))
синтаксис.источник
((...))
является ключом к использованию арифметики. в баш. Я не осознавал, что просто смотрел на принятый ответ - я думал, что есть странный набор правил о порядке операций или что-то, что приводит к круглым скобкам в принятом ответе.Анализ производительности различных вариантов
Благодаря ответу Раду Рэдяну, который предоставляет следующие способы увеличения переменной в bash:
Есть и другие способы. Например, посмотрите другие ответы на этот вопрос.
Наличие множества вариантов приводит к этим двум вопросам:
Инкрементальный тест производительности кода:
Результаты:
Заключение:
Кажется, bash работает быстрее всего,
i+=1
когда$i
объявлено как целое число.let
утверждения кажутся особенно медленными, иexpr
, безусловно, самыми медленными, потому что они не являются встроенными.источник
Там также это:
Обратите особое внимание на пробелы , а также ` не '
Хотя ответы Раду и комментарии являются исчерпывающими и очень полезными, они относятся к конкретным аспектам. Я знаю, что вы специально спрашивали о bash, но я подумал, что смогу перейти, так как я нашел этот вопрос, когда хотел сделать то же самое, используя sh в busybox под uCLinux. Это портативный за пределами Баш.
источник
i=$((i+1))
$(...)
в этой оболочке доступна подстановка процесса , я бы рекомендовал использовать ее вместо этого.Если вы объявите
$var
целое число, то то, что вы попробовали в первый раз, будет работать:Справка: типы переменных, руководство по Bash для начинающих
источник
Во всех ответах отсутствует один метод -
bc
bc
определяется стандартом POSIX , поэтому должен присутствовать во всех версиях Ubuntu и POSIX-совместимых систем.<<<
Перенаправление может быть изменено , чтобыecho "$VAR" | bc
портативность, но поскольку вопрос касаетсяbash
- это нормально , просто использовать<<<
.источник
Проблема с кодом возврата
1
присутствует для всех вариантов по умолчанию (let
,(())
и т. Д.). Это часто вызывает проблемы, например, в сценариях, которые используютset -o errexit
. Вот то, что я использую, чтобы предотвратить код ошибки1
от математических выражений, которые оценивают0
;источник
Это должен быть худший способ выполнить такую простую задачу, но я просто хотел документировать это для забавы, я думаю (полная противоположность кода гольфу).
или же
Серьезно используйте один из других гораздо лучших вариантов здесь.
источник