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

${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,*或^^案件转换;
 对于其他一些扩展,例如${parameter ## word};
 使用前缀/后缀或 – 运算符;
 使用$((n))而不是n.

但是,长度扩展${#parame}可以正常工作:
在上面的代码段中,echo“${#a [n]} – > ${n}”而不是echo“${a [n],} – > ${n}会产生3> 2而不是三 – > 3~& a [2] =“2”的长度实际上是3个字符.

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

解决方法

我抓住了最新的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稳定版上,我有

$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)&包含这个bug.同样在Cygwin 1.7.11-1上,目前最新的bash软件包似乎是版本4.1.10(4)&包含这个bug.当然这个问题很容易解决,所以不需要构建4.2源代码.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...