unset
我已阅读了参考书目中列出的有关、declare
和“Shell 函数”的内容local
。
我的 Bash 版本是
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
var='outer'
declare -p var
unset var
declare -p var
function foo {
echo \""I'm in"\"
local var='inner'
declare -p var
unset var
declare -p var
}
foo
(周围奇怪的引用I'm in
只是为了保留以下块引用中的语法高亮。)这将打印
declare -- var="outer"
bash: declare: var: not found
"I'm in"
declare -- var="inner"
declare -- var
取消设置全局变量和取消设置函数内的局部变量是有区别的。在前一种情况下,变量会被删除。在后一种情况下,变量保持声明状态(但未设置)。
有没有办法完全删除函数内部的局部变量(在函数返回之前)?也就是说,输出将是
declare -- var="outer"
bash: declare: var: not found
"I'm in"
declare -- var="inner"
bash: declare: var: not found
这对于测试函数中某个变量是否不存在很有用,例如
function foo {
local var
while
declare -p var
do
echo "$var"
((var++))
[[ "$var" -eq 4 ]] \
&& unset var
done
}
此代码无限循环,打印
declare -- var="1"
1
declare -- var="2"
2
declare -- var="3"
3
declare -- var
declare -- var="1"
1
declare -- var="2"
2
declare -- var="3"
3
declare -- var
[omissis]
使用检查变量是否存在有什么错误吗declare -p
?
我在 Bash 参考手册中找到的唯一关于取消设置全局变量和局部变量之间的区别的提及是
如果当前局部范围内的变量未设置,它将保持这种状态(显示为未设置),直到在该范围内重置或直到函数返回。(参考 Bash 参考手册 - “Shell 函数”部分)
其中出现的单词是唯一的线索。
参考书目
- Bash 参考手册第 4 节“Shell 内置命令”
- unset 起什么作用?