在阅读了 ilkkachu 对这个问题的回答后,我了解到内置的declare
(带参数-n
)shell的存在。
help declare
带来:
设置变量值和属性。
声明变量并赋予它们属性。如果没有给出名称,则显示所有变量的属性和值。
-n ... 使 NAME 成为对其值命名的变量的引用
我要求用一个例子declare
做一个一般性的解释,因为我不理解man
. 我知道什么是变量和扩大,但我还是错过了man
上declare
(可变属性?)。
也许您想根据 ilkkachu 在答案中的代码来解释这一点:
#!/bin/bash
function read_and_verify {
read -p "Please enter value for '$1': " tmp1
read -p "Please repeat the value to verify: " tmp2
if [ "$tmp1" != "$tmp2" ]; then
echo "Values unmatched. Please try again."; return 2
else
declare -n ref="$1"
ref=$tmp1
fi
}
Run Code Online (Sandbox Code Playgroud) 我认为typeset
是ksh
's local
,但这失败了,ksh93
尽管它适用于我所有其他typeset
支持的 shell(bash、yash、zsh、pdksh)
#!/bin/ksh -ex
foo(){
typeset a b
a=0; b=1
return
}
a=a; b=b
foo
#confirm that the globals didn't change
[ "$a" = a ]
[ "$b" = b ]
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?
来自https://unix.stackexchange.com/a/381782/674
例如:
Run Code Online (Sandbox Code Playgroud)integer() { typeset -gi "$1"; }
为了使变量的整数工作
mksh
/yash
/zsh
。它bash
仅适用于未被调用者声明为本地的变量:Run Code Online (Sandbox Code Playgroud)$ bash -c 'f() { declare a; integer a; a=1+1; echo "$a"; }; integer() { typeset -gi "$1"; }; f' 1+1 $ bash -c 'f() { integer a; a=1+1; echo "$a"; }; integer() { typeset -gi "$1"; }; f' 2
请注意,
export var
既不是 也不typeset -x var
是typeset -gx var
。export
如果变量已经存在,它会在不声明新变量的情况下添加属性。readonly
vs相同typeset -r
。 …
我试图了解以下部分:unset
https ://unix.stackexchange.com/a/381782/674
unset
仅bash
当变量已在当前作用域中声明时才取消设置该变量(尽管在全局作用域中除外,但仍保留其声明;它删除属性和值,并且该变量不再是数组或散列;另请注意,在 namerefs 上,它取消设置引用的变量)多变的)。否则,它只是从上面提到的堆栈中弹出一个变量层。
Bash手册没有提到任何相关的内容,或者我错过了。
你能用例子解释一下吗
“尽管在全局范围内除外,但仍保留其声明”。
如果unset
变量位于函数的局部作用域中,那么该unset
变量不仅未设置而且未声明吗?
如果unset
变量位于全局范围内,该unset
变量是否只是未设置但仍已声明?
如何检查变量是否已声明?
“否则,它只会从上面提到的堆栈中弹出一个变量层。”
“否则”和“一个变量层”是什么意思?
谢谢。