「名前参照」変数属性とは何ですか? [コピー]

「名前参照」変数属性とは何ですか? [コピー]

読んだ後この回答著者: Kusalananda 変数属性が何であるかについてある程度知っていますが、変数属性の「名前参照」(型?) とは何か、その目的が何なのか、なぜ bash スクリプトで使用されるのかが欠けています。

「名前参照」(引用符を除く)という用語をインターネットで検索してみましたが、その用語のWiki記事を見つけることができませんでした。

答え1

例:2回通過分離機能する配列。

#!/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

名前で変数を参照せずに同じことを行うのは難しい場合があります。呼び出しごとに1つの配列のみを処理するように関数を変更したり、2つの配列のそれぞれの要素数を追加の引数として使用したり、特定のeval方法(正しく実行するのは難しい)です。

関数から名前で変数を参照すると、関数に渡された(名前で)配列のデータを使用するのに難しい構文は必要なく、関数は通常の配列のように名前で変数を参照できます。

関数内の2つの変数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表示され、変数には実際の値があります。reffoofoo

$ declare -p foo ref
declare -- foo="456"
declare -n ref="foo"                   

関連情報