什么是“名称引用”变量属性?

什么是“名称引用”变量属性?

看完之后这个答案作者: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以某种方式使用(这很难正确执行)。

通过在函数中使用名称引用变量,不需要深奥的语法即可使用传递(作为名称)到函数的数组中的数据,并且函数能够像普通数组一样使用名称引用变量。

在函数中,两个变量array1array2引用,即可以用作,在$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"                   

相关内容