首先我跟随这个答案然后我搜索test -v
一下https://linuxcommand.org/lc3_man_pages/testh.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
接收两个字符串作为参数。这些字符串是数组的名称。通过使用local
with -n
,我将tasks
和声明hosts
为名称引用变量,引用命名变量。由于我传递给函数的名称变量是数组,因此我可以在函数中将名称引用变量用作数组。
您的代码中的错误是名称引用变量不能是数组,这就是您的array1
变量,这就是您no
从语句中获得输出的原因if
。当您运行代码时,shell 也会提到此错误:
$ 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