Bash参数扩展和数组索引操作

时间:2012-04-08 18:31:22

标签: arrays bash parameters

${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}的工作原理如我所料: 在上面的代码段中,echo "${#a[++n]}->${n}"而不是echo "${a[++n],,}->${n}会产生3->2而不是three->3〜&一个[2] ="两个"的长度确实是3个字符。


我认为参数扩展发生了两次。但为什么会这样呢?

2 个答案:

答案 0 :(得分:1)

我抓住了最新的bash源码&此版本似乎已解决此问题:

$ ./bash --version
GNU bash, version 4.2.24(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
$

但请注意,在我的Debian Squeeze stable 上,我有:

$ apt-cache policy bash
bash:
  Installed: 4.1-3
  Candidate: 4.1-3
  Version table:
 *** 4.1-3 0
        500 http://ftp.uk.debian.org/debian/ squeeze/main amd64 Packages
        100 /var/lib/dpkg/status
$
$ bash --version
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>


我认为这意味着目前在 Debian Squeeze 上,bash的最新稳定版本是 4.1.5(1)&amp;包含这个bug。同样在 Cygwin 1.7.11-1 目前,最新的可用bash包似乎是版本 4.1.10(4)&amp;包含这个bug。当然这个问题很容易解决,因此不需要构建 4.2 来源。

答案 1 :(得分:0)

我得到了

Zero->0
One->1
Two->2

但我认为“$ {a [++ n]} - &gt; $ {n}”可能没有明确定义。

尝试用

代替
let n=$n+1 ; echo "${a[n],,}->${n}";

注入序列的概念。