Bash

test -R 如果設置了 shell 變數 VAR 並且是名稱引用,則為真

  • December 27, 2021

首先我遵循這個答案然後我搜尋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,這意味著它不是名稱引用。那麼如何基於上面的程式碼塊來展示命名引用

“名稱引用”變數是按名稱引用另一個變數的變數。

$ 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函式接收兩個字元串作為參數。這些字元串是數組的名稱。通過使用localwith -n,我將tasksand聲明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

引用自:https://unix.stackexchange.com/questions/684038