Переменная объединяется, а не увеличивается в 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