Недавно я обновил свою систему и получил новую версию 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[@]
В GNU bash версии 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
в то время как более новая версия GNU bash, версия 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 в Bash 4.3. Справка (help declare) одинакова в обеих версиях для всей соответствующей информации. Я даже наткнулся на утверждение, что «все переменные могут использоваться как массивы без явного определения». (см. Почему объявляют -f и объявляют - требуется в сценариях bash?).
Кто-нибудь может объяснить такое поведение? Это новая функция? Или просто баг? Ограничена ли передача массивов функциям? Для меня это довольно страшно, когда поведение bash внезапно меняется от версии к версии.