まず私が従うこの回答その後、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
上記の関数はworker
2つの文字列をパラメータとして受け取ります。この文字列は配列の名前です。local
withを使用して名前参照変数として参照名前付き変数を宣言-n
します。関数に渡す名前変数は配列なので、関数内の名前参照変数を配列として使用できます。tasks
hosts
コードのエラーは、名前参照変数が配列にできないことです。これが変数であり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