【问题标题】:bash: unexpected array member handlebash:意外的数组成员句柄
【发布时间】:2013-08-14 15:38:50
【问题描述】:

我在最后一个命令行中发现以下 bash 行为很奇怪。对我来说,这是完全出乎意料的。

$ set | grep ^BASH_VERSINFO             # Show the array
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")

$ echo "${BASH_VERSINFO[@]}"             # Print all array
3 2 25 1 release x86_64-redhat-linux-gnu

$ echo "${BASH_VERSINFO[@]%e}"           # Print all array removing final 'e' of every member
3 2 25 1 releas x86_64-redhat-linux-gnu

$ i=4; echo "${BASH_VERSINFO[i]}"        # Print an array member
release
$ i=4; echo "${BASH_VERSINFO[i++]}"      # Print an array member and increase the 'i' variable
release
$ i=4; echo "${BASH_VERSINFO[i]%e}"      # Print an array member removing the final 'e'
releas
$ i=4; echo "${BASH_VERSINFO[i++]%e}"    # Why does bash use the next member?
x86_64-redhat-linux-gnu

似乎 bash 预先增加了 'i' 变量。

类似的奇怪行为:

$ i=5; echo "${BASH_VERSINFO[--i]}"    # Print array member ${BASH_VERSINFO[4]}. 'i' is descreased one time.
release
$ i=5; echo "${BASH_VERSINFO[--i]%e}"  # Print array member ${BASH_VERSINFO[3]%e}. 'i' is descreased two times.
1

谁能告诉我这种行为?

提前感谢

【问题讨论】:

    标签: arrays bash indexing post-increment pre-increment


    【解决方案1】:

    这似乎是一个已经修复的错误,可能是这个:

    (来自bash ChangeLog -- bash-4.2-alpha 和 bash-4.1-release 之间的变化)

    修复了导致数组索引的算术扩展错误 在某些情况下要评估两次扩展。

    工作表:

    $ echo "${BASH_VERSINFO[*]}"
    4 2 42 1 release i586-pc-linux-gnu
    $ i=4; echo "${BASH_VERSINFO[i++]}"; echo "$i"
    release
    5
    $ i=4; echo "${BASH_VERSINFO[i++]%e}"; echo "$i"
    releas
    5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多