test -R 如果 shell 变量 VAR 已设置并且是名称引用,则为 True

test -R 如果 shell 变量 VAR 已设置并且是名称引用,则为 True

首先我跟随这个答案然后我搜索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和设置barfoo

名称引用有多种用途,例如将数组传递给函数时:

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接收两个字符串作为参数。这些字符串是数组的名称。通过使用localwith -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

相关内容