我最近更新了我的系统并获得了一个新的bash版本。从那时起,我遇到了一些令人讨厌的bash脚本行为,我最终设法追查bash的声明 / 本地的新行为命令。
考虑以下最小的工作示例:
#!/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[@]
在 GNU bash上,版本4.2.25(1)-release(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
而较新的 GNU bash版本4.3.11(1)-release(x86_64-pc-linux-gnu)版本返回
Declaration as indexed array:
Undefined declaration:
01 02 03 04 05 06 07 08 09 10
10
请注意,当我使用"声明"时,行为是相同的。而不是"本地"。
我在Bash 4.3中找不到有关更改声明选项的任何内容。对于所有相关信息,帮助(帮助声明)在两个版本中都相同。我甚至偶然发现了这样的说法,即#34;所有变量都可以用作没有明确定义的数组。" (见Why are "declare -f" and "declare -a" needed in bash scripts?)。
任何人都可以解释这种行为吗?这是一个新功能吗?或者只是一个bug?数组到函数的传递是否受到限制?对我来说,当bash行为突然从版本变为版本时,它非常可怕。