【问题标题】:Bash parameter expansion and array index operationsBash参数扩展和数组索引操作
【发布时间】: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


【解决方案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 源代码。

【讨论】:

    【解决方案2】:

    我明白了

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

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

    尝试用

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

    注入序列的概念。

    【讨论】:

    • 如果您仔细查看结果,您会注意到Zero 和Two 都没有转换为小写。现在尝试使用echo "${a[++n]foo}-&gt;${n}" 相同的结果!此时您可能想要检查您的 bash 版本。例如,在 Bash 3.2.25(1) 上,我也得到了上述结果;)
    • 小写表达式在 bash 3 中无效。
    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多