【发布时间】:2012-04-08 18:31:21
【问题描述】:
${parameter,,pattern} 参数扩展将参数中的字母字符转换为小写。
在 cygwin 1.7.11-1 Bash 4.1.10(4) 以及我的 debian squeeze Bash 4.1.5(1) 上;
如果我运行以下命令,我会得到一个奇怪的结果:
$ declare -a a=(Zero One Two Three); n=0; echo "${a[n],,}->${n}"; echo "${a[++n]}->${n}"; echo "${a[++n],,}->${n}"
zero->0
One->1
three->3
$
注意:会发生类似的结果:
用于,,* 或^^ 大小写转换;
对于其他一些扩展,例如${parameter##word};
用于使用前缀/后缀 ++ 或 -- 运算符;
使用$((++n)) 而不仅仅是++n。
但是,长度扩展 ${#parameter} 可以正常工作:
在上面的 sn-p 中,echo "${#a[++n]}->${n}" 而不是 echo "${a[++n],,}->${n} 会产生 3->2 而不是 three->3 ~& a[2]="two" 的长度确实是 3 个字符。
我想 parameter 扩展发生了两次。但是为什么会这样呢?
【问题讨论】:
-
你的意思是为什么数组迭代中值的重新排序?
-
我的意思是我希望得到回报:
zero->0 One->1 two->2 -
+1 表示一个经过充分调查的问题,但我认为您不会得到一个好的答案,因为我认为这只是一个错误。在我的系统上,如果我添加另一个
"${a[++n],,}"应该 移动到最后一个元素但会(根据您的结果)将一个移动到末尾,Bash 崩溃(!)数组。 -
顺便说一句,如果您可以确认它发生在最新版本的 Bash 中,并且如果没有人提供关于它可能是什么而不是错误的理论,gnu.org/software/bash/manual/html_node/Reporting-Bugs.html 有说明如何举报。
-
ruakh,同意。它可能应该被标记为错误 - 因为你说它可以被设置为段错误。我现在正在获取 bash 源代码,一旦我查看了内部内容就会提出报告
标签: arrays bash parameters