Переменная объединяется, а не увеличивается в BASH

Вот код:

v=0
for var in "$@";do
        echo $var
        v+=1
        echo $v
done

Вот команда:

$ bash MyScript.sh duck duck goose

Вот вывод:

duck
01
duck
011
goose
0111

Таким образом, мне кажется, что переменная v рассматривается как строка или не целое число. Я не уверен, почему это будет сделано, и я чувствую, что это простая проблема, которую я просто пропускаю одну маленькую деталь.

Это пример ловушек нестатической типизации?

Спасибо,

3 ответа

Решение

Используйте математический контекст для выполнения математики. Специфичный для bash синтаксис: (( )):

(( v += 1 )) # not POSIX compliant, not portable

С другой стороны, POSIX-совместимый синтаксис для математического контекста $(( )):

v=$(( v + 1 )) # POSIX-compliant!

...или же...

: $(( v += 1 )) # POSIX-compliant!

Там также не POSIX-совместимый let операция:

let v+=1 # not POSIX compliant, not portable, don't do this

... и аналогично не POSIX-совместимым declare -i:

declare -i v # not POSIX compliant, not portable, don't do this
             # ...also makes it harder to read or reuse snippets of your code
             # ...by putting action and effect potentially further from each other.
v+=1

Баш не делает этого. Вы должны использовать синтаксис математической операции $((...))а именно:

v=0
for var in "$@";do
    echo $var
    v=$((v+1))
    echo $v
one

Выход из bash <file> duck duck duck goose:

duck
1
duck
2
duck
3
goose
4

Просто добавь typeset -i v к вашей оболочке:

пример:

typeset -i v
v=12
v+=1
echo $v

дает

13
Другие вопросы по тегам