test -Rシェル変数VARが設定され、名前参照の場合はtrueです。

test -Rシェル変数VARが設定され、名前参照の場合はtrueです。

まず私が従うこの回答その後、test -v検索します。https://linuxcommand.org/lc3_man_pages/testth.htmlオプションがあることを示しますR
test -R名前の好みに関連があるようです。
次に検索します。名前参照それから見つけました。「名前参照」変数属性とは何ですか? しかし、まだ**名前付き参照**が何を意味するのかわかりません。

array1=([11]="triage" 51=["trajectory"] 129=["dynamic law"])

for i in 10 11 12 30 {50..51} {128..130}; do
        if [ -v 'array1[i]' ]; then
                echo "Variable 'array1[$i]' is defined"
        else 
                echo "Variable 'array1[$i]' not exist"
        fi
done
declare -n array1=$1
printf '\t%s\n' "${array1[@]}"

if [ -R 'array1' ]; then
        echo "Yes"
        else echo "no" 
fi

最後のifブロックはを返すので、noこれは名前参照ではないことを意味します。では、上記のコードブロックに基づいてデモンストレーションする方法は?命名参照

答え1

「名前参照」変数は、名前で別の変数を参照する変数です。

$ foo='hello world'
$ declare -n bar=foo
$ echo "$bar"
hello world
$ bar='goodbye'
$ echo "$foo"
goodbye
$ [[ -R foo ]] && echo nameref
$ [[ -R bar ]] && echo nameref
nameref

上記の例では、変数はfoo一般的な変数barですが、名前は変数を指す変数を意味しますfoo。アクセス値$barアクセス$fooと設定がbar設定されますfoo

名前参照は、配列を関数に渡すなど、さまざまな方法で使用されます。

worker () {
    local -n tasks="$1"
    local -n hosts="$2"

    for host in "${hosts[@]}"; do
        for task in "${tasks[@]}"; do
            # run "$task" on "$host"
        done
    done
}

mytasks=( x y z )
myhosts=( a b c )

my_otherhosts=( k l m )

worker mytasks myhosts        # run my tasks on my hosts
worker mytasks my_otherhosts  # run my tasks on my other hosts

上記の関数はworker2つの文字列をパラメータとして受け取ります。この文字列は配列の名前です。localwithを使用して名前参照変数として参照名前付き変数を宣言-nします。関数に渡す名前変数は配列なので、関数内の名前参照変数を配列として使用できます。taskshosts

コードのエラーは、名前参照変数が配列にできないことです。これが変数でありarray1、これがnoステートメントから出力を取得する理由ですif。コードを実行すると、シェルでもこの​​エラーが言及されます。

$ bash script
Variable 'array1[10]' not exist
Variable 'array1[11]' is defined
Variable 'array1[12]' is defined
Variable 'array1[30]' not exist
Variable 'array1[50]' not exist
Variable 'array1[51]' not exist
Variable 'array1[128]' not exist
Variable 'array1[129]' not exist
Variable 'array1[130]' not exist
script: line 10: declare: array1: reference variable cannot be an array
        triage
        51=[trajectory]
        129=[dynamic law]
no

あなたは持つことができますその他ただし、変数参照は次array1のとおりです。

declare -n array2=array1

関連情報