Я озадачен выводом этого примера сценария. Кажется, что some_other_var неявно объявляется как локальный, когда я объявляю его в верхнем регистре (объявить -u):
#!/bin/bash
function works() {
some_var="${1}"
printf "in the function, some_var is ${some_var}\n"
}
function doesnt_work() {
declare -u some_other_var="${1}"
printf "in the function, some_other_var is ${some_other_var}\n"
}
works "apple"
printf "got back this value of some_var from the function: ${some_var}\n"
doesnt_work "banana"
printf "got back this value of some_other_var from the function: ${some_other_var}\n"
Выход:
in the function, some_var is apple
got back this value of some_var from the function: apple
in the function, some_other_var is BANANA
got back this value of some_other_var from the function:
объявить -u должен сделать переменную только в верхнем регистре, что он и делает. Но предполагается ли также сделать переменную локальной области видимости? У меня сложилось впечатление, что нужно было использовать директиву «local», чтобы явно пометить переменную как локальную, иначе она была глобальной, но declare -u, похоже, ведет себя по-другому.
Это:
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Решение проблемы
Это общее свойство declare: при использовании в функции подразумевается локальная область. Чтобы использовать глобальную область видимости, необходимо использовать -gфлаг (Bash 4.2+).
См. руководство:
При использовании в функции declareделает каждое имя локальным, как и в localкоманде, если не используется -gпараметр.
Комментариев нет:
Отправить комментарий