从bash 4.2到4.3,declare/local的行为发生了变化

从bash 4.2到4.3,declare/local的行为发生了变化,bash,Bash,我最近更新了我的系统,得到了一个新的bash版本。从那以后,我遇到了bash脚本的一些恶劣行为,我最终设法找到了bash的declare/local命令的一种新行为 考虑以下最小工作示例: #!/bin/bash function printarray1 () { local -a arr=("${!1}") echo "${arr[@]}" # printing the complete array echo "${arr[9]}" # just to check if it i

我最近更新了我的系统,得到了一个新的bash版本。从那以后,我遇到了bash脚本的一些恶劣行为,我最终设法找到了bash的declare/local命令的一种新行为

考虑以下最小工作示例:

#!/bin/bash

function printarray1 () {
  local -a arr=("${!1}")
  echo "${arr[@]}" # printing the complete array
  echo "${arr[9]}" # just to check if it is really recognized as an integer indexed array
}

function printarray2 () {
  local arr=("${!1}")
  echo "${arr[@]}" # printing the complete array
  echo "${arr[9]}" # just to check if it is really recognized as an integer indexed array
}

arr=("01" "02" "03" "04" "05" "06" "07" "08" "09" "10")
echo "Declaration as indexed array:"
printarray1 arr[@]
echo "Undefined declaration:"
printarray2 arr[@]
在GNUBash的4.2.25(1)版发行版(x86_64-pc-linux-GNU)上,这会导致

Declaration as indexed array:
01 02 03 04 05 06 07 08 09 10
10
Undefined declaration:
01 02 03 04 05 06 07 08 09 10
10
而较新的GNUBash版本4.3.11(1)-发行版(x86_64-pc-linux-GNU)返回

Declaration as indexed array:

Undefined declaration:
01 02 03 04 05 06 07 08 09 10
10
请注意,当我使用“declare”而不是“local”时,行为是相同的

我在bash4.3中找不到任何关于declare选项更改的信息。对于所有相关信息,两个版本中的帮助(帮助声明)是相同的。我甚至偶然发现了“所有变量都可以在没有明确定义的情况下用作数组”的说法


有人能解释这种行为吗?这是新功能吗?还是仅仅是一个bug?向函数传递数组是否受到限制?对我来说,bash行为在不同版本之间突然发生变化是非常可怕的。

问题在于变量名冲突。使用另一个全局变量,问题就会消失。使用另一个变量名,它确实可以工作。但这并不能真正解释bash4.2和4.3之间的不同行为,也不能解释declare-a和declare。我假设local关键字背后的含义是从局部范围隐藏变量。是的。我没有看到任何可以解释它的注释,我本以为它会在新版本中完全崩溃,而不仅仅是部分崩溃。我觉得在我不得不去寻找它之前,我已经看到了一个关于这个问题的问题。@EtanReisner您可能还记得几个月前的事,尽管这与
bash 3.1
@123中的一个bug有关,几乎可以肯定是正确的。谢谢不过,我现在还没有时间来看看这里是否也有类似的应用。问题是变量名冲突。使用另一个全局变量,问题就会消失。使用另一个变量名,它确实可以工作。但这并不能真正解释bash4.2和4.3之间的不同行为,也不能解释declare-a和declare。我假设local关键字背后的含义是从局部范围隐藏变量。是的。我没有看到任何可以解释它的注释,我本以为它会在新版本中完全崩溃,而不仅仅是部分崩溃。我觉得在我不得不去寻找它之前,我已经看到了一个关于这个问题的问题。@EtanReisner您可能还记得几个月前的事,尽管这与
bash 3.1
@123中的一个bug有关,几乎可以肯定是正确的。谢谢不过,我现在没有时间来看看类似的东西是否也适用于这里。