4

参数扩展将参数中的${parameter,,pattern}字母字符转换为小写。

cygwin 1.7.11-1 Bash 4.1.10(4)和我的debian 挤压 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
$

注意:发生类似结果:
for,,*^^case 转换;
对于其他一些扩展,例如${parameter##word};
用于使用前缀/后缀++--运算符;
用于使用$((++n))而不是仅++n.

但是,长度扩展${#parameter}正如我所料:
在上面的代码片段中,echo "${#a[++n]}->${n}"而不是echo "${a[++n],,}->${n}会产生3->2而不是three->3~& a[2]="two" 的长度确实是 3 个字符。


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

4

2 回答 2

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) & 包含这个错误。同样在Cygwin 1.7.11-1上,当前最新的可用 bash 包似乎是版本4.1.10(4)并且包含此错误。当然这个问题很容易解决,所以不需要构建4.2源代码。

于 2012-04-09T12:10:50.127 回答
0

我有

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

但是我认为“${a[++n]}->${n}”可能没有很好的定义。

尝试用

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

注入序列的概念。

于 2012-04-09T06:45:14.207 回答