2016-08-01 3 views
0

Вот код:Переменная конкатенации, не увеличивающиеся в BASH

v=0 
for var in "[email protected]";do 
     echo $var 
     v+=1 
     echo $v 
done 

Вот команда:

$ bash MyScript.sh duck duck goose 

Здесь выход:

duck 
01 
duck 
011 
goose 
0111 

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

Это пример подводных камней нестатического ввода текста?

Thanks,

+0

краткая форма: строки являются типом по умолчанию для * все * в bash. –

ответ

0

Используйте математический контекст для выполнения математики. Баш-специфический синтаксис для этого (()):

((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 
+0

Полностью забыли про эти благодарности! Спасибо, что поймал титул. Мой автокоррект угадал неправильно :) – Josafoot

0

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

v=0 
for var in "[email protected]";do 
    echo $var 
    v=$((v+1)) 
    echo $v 
one 

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

duck 
1 
duck 
2 
duck 
3 
goose 
4 
+0

btw, 'for var in" $ @ "; do' также может быть записано как 'for var; do'. –

0

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

пример:

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

дает

13 
+0

Это работает, но я бы не стал называть его хорошей практикой: он делает ваш код труднее читать, потому что нужно знать контекст, чтобы знать, как его интерпретировать. –

+0

Кроме того, в отличие от '$ (())', это багизм и не будет работать на всех оболочках POSIX. –