Bash
test -R 如果設置了 shell 變數 VAR 並且是名稱引用,則為真
首先我遵循這個答案然後我搜尋
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
函式接收兩個字元串作為參數。這些字元串是數組的名稱。通過使用local
with-n
,我將tasks
and聲明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