【问题标题】:Variable is concatenating, not incrementing in BASH变量是连接的,而不是在 BASH 中递增
【发布时间】:2016-12-06 19:38:45
【问题描述】:

代码如下:

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 视为字符串或不是整数。我不确定它为什么会这样做,我觉得这是一个简单的问题,我只是忽略了一个小细节。

这是非静态类型缺陷的一个例子吗?

谢谢,

【问题讨论】:

  • 简写形式:字符串是 bash 中 everything 的默认类型。

标签: bash variables integer typing


【解决方案1】:

使用数学上下文来执行数学运算。特定于 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

【讨论】:

  • 完全忘记了这些感谢!感谢您抓住标题。我的自动更正猜错了:)
【解决方案2】:

只需将 typeset -i v 添加到您的 shell:

示例:

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

给予

13

【讨论】:

  • 这行得通,但我不认为这是一种好的做法:它使您的代码更难阅读,因为必须知道上下文才能知道如何解释它。
  • 另外,与 $(( )) 不同,这是一种 bashism,不适用于所有 POSIX shell。
【解决方案3】:

Bash 不这样做。你必须使用数学运算语法$((...)),即:

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

【讨论】:

  • 顺便说一句,for var in "$@"; do 也可以写成for var; do
猜你喜欢
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2018-09-29
  • 1970-01-01
相关资源
最近更新 更多