看完之后这个答案作者:Kusalananda 我对什么是变量属性有了一些了解,但我想念什么是变量属性的“名称引用”(类型?),它的用途是什么,为什么要在bash 脚本,
我尝试用 Google 搜索术语“名称引用”(不带引号),但没有找到有关该术语的 wiki 文章。
答案1
示例:通过两个分离数组到函数。
#!/bin/bash
foo () {
declare -n array1="$1"
declare -n array2="$2"
echo 'The 1st array:'
printf '\t%s\n' "${array1[@]}"
echo 'The 2nd array:'
printf '\t%s\n' "${array2[@]}"
}
a=( 1 2 3 )
b=( a b c )
foo a b
测试:
$ bash script.sh
The 1st array:
1
2
3
The 2nd array:
a
b
c
在不使用名称引用变量的情况下做同样的事情会很困难,并且可能涉及将函数更改为每次调用仅处理一个数组,或者将两个数组中每个数组中的元素数量作为额外参数,或eval
以某种方式使用(这很难正确执行)。
通过在函数中使用名称引用变量,不需要深奥的语法即可使用传递(作为名称)到函数的数组中的数据,并且函数能够像普通数组一样使用名称引用变量。
在函数中,两个变量array1
和array2
引用,即可以用作,在$1
和中按名称传递的变量$2
。他们是名称参考。
我相信这类似于 C++ 中的“按引用调用”,但不是&variable
在调用方使用(如 C++ 中),而是接收方将局部变量声明为引用。
答案2
有些属性更像是所谓的变量类型在其他语言中。名称引用就是这样一种“类型”。与许多语言中的引用一样,对变量的访问实际上会访问其他一些变量(被引用的变量)。唯一的例外是使用来declare -n
设置引用的变量或declare -p
显示它时。
所以,例如
foo=123
declare -n ref=foo # set what 'ref' points to
ref=456 # set the value of 'foo'
echo "$foo $ref" # both are the value of 'foo'
会打印456 456
.
但是,declare -p
将显示ref
是对 的引用foo
,并且foo
该变量具有实际值。
$ declare -p foo ref
declare -- foo="456"
declare -n ref="foo"