【问题标题】:Strange Bash Variable Assignment Behaviour in For LoopFor循环中奇怪的Bash变量赋值行为
【发布时间】:2014-08-29 13:58:30
【问题描述】:

我在 for 循环中分配一个变量,在其中我从提供的输入中生成输出文件名。

我以前从未遇到过数组或 for 循环的任何问题,但这种行为非常奇怪。我在代码的其他地方使用了类似的 for 循环,它们都可以正常工作。下面的代码工作正常,变量按预期分配。

count=1

for i in "${INPUT[@]}"
do
    local INPUT[$count]=`echo -n "$i" | sed 's/\(.\)/\1\n/g'`

    let count=count+1
done

一切都按预期工作,但是,下面的代码不起作用。

count=1

for i in "${INPUT[@]}"
do
    local OUTFILE[$count]="$i"

    let count=count+1
done

如果我回显 $INPUT[$count] 或 $i 的值,我会得到预期的结果,但是,当我在分配后回显 $OUTFILE[$count] 的值时,它会显示为 [1] , [2], [3] 等而不是人名,人名,人名等。

【问题讨论】:

  • 这里local关键字的作用是什么?
  • 在函数内部
  • 我以前没见过这种用法。它将整个数组变成局部变量吗?或者只是这个条目?这个语法有参考吗?
  • 把它拿出来有用吗?
  • 无关提示:由于数组索引是在算术上下文中计算的,因此您可以将 count "inline" 与 local OUTFILE[count++]="$i" 递增。

标签: arrays linux bash shell for-loop


【解决方案1】:

听起来你在写类似的东西

echo $OUTFILE[$count]

什么时候该写

echo ${OUTFILE[$count]}

【讨论】:

  • 是的,就是这样,我现在觉得很傻。它是作为完整文件路径的一部分的较大字符串连接的一部分,我的花括号放错了位置。谢谢!
【解决方案2】:

要将一个数组复制到另一个不需要循环的 BASH 数组中,您可以这样做:

OUTFILE=( "${INPUT[@]}" )

【讨论】:

  • 谢谢!这不是问题的原因,但知道这是一件好事,所以谢谢!虽然,我对此很好奇,因为我没有在文档中看到它,而且 Vim 用红色突出显示右外括号以表明语法无效。
  • @Kervate 没有什么需要在文档中明确指出的。这只是正常的数组构造,其中值是从另一个数组的所有元素的扩展中获取的。 vim 不应该错误地强调这一点(我想如果不是在 bash 模式下很可能,但我认为这也是一个错误)。
  • 是的 vim 高亮有很多模式,最好选择 BASH 模式以获得正确的语法高亮。
  • 很确定它处于 Bash 模式,因为我使用了一些 Bashism,例如“local”和“function”,它的语法突出了所有这些细节
猜你喜欢
  • 2016-06-01
  • 2012-12-16
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
相关资源
最近更新 更多