取消设置有什么作用?

Tim*_*Tim 6 bash

我试图了解以下部分:unsethttps ://unix.stackexchange.com/a/381782/674

unsetbash 当变量已在当前作用域中声明时才取消设置该变量尽管在全局作用域中除外,但仍保留其声明;它删除属性和值,并且该变量不再是数组或散列;另请注意,在 namerefs 上,它取消设置引用的变量)多变的)。否则,它只是从上面提到的堆栈中弹出一个变量层。

Bash手册没有提到任何相关的内容,或者我错过了。

你能用例子解释一下吗

  • “仅取消设置已在当前作用域中声明的变量”
  • “尽管在全局范围内除外,但仍保留其声明”。

    如果unset变量位于函数的局部作用域中,那么该unset变量不仅未设置而且未声明吗?

    如果unset变量位于全局范围内,该unset变量是否只是未设置但仍已声明?

    如何检查变量是否已声明?

  • “否则,它只会从上面提到的堆栈中弹出一个变量层。”

    “否则”和“一个变量层”是什么意思?

谢谢。

Sté*_*las 9

最好举例说明:

$ bash -c 'a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"'
declare -- a
0
Run Code Online (Sandbox Code Playgroud)

这是unset在同一范围内声明的变量上调用的。它已正确未设置。它仍然被声明(尽管它已经丢失了属性和值),但它仍然限于该范围。您会看到,即使我们执行了 a a=2,但仍然是在a本地 to上完成的f,来自外部范围的不受影响。这很好,也是我们想要的。

在:

$ ./bash -c 'a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"'
0
2
Run Code Online (Sandbox Code Playgroud)

可以看到并unset a没有取消设置a。相反,它揭示了下面的那个,来自外部范围的那个。当g返回时,fa变量将不再是局部的。

在 bash 5+ 中,可以通过设置localvar_unset选项来解决这个问题。

请注意,mksh即使对于已在同一范围内声明的变量,弹出而不是取消设置的yash情况更糟。他们的第一个例子给出:unset

typeset a=0
2
Run Code Online (Sandbox Code Playgroud)

进一步阅读: