Bash
如何將參數用作腳本的內部數組名稱?
當我編寫一個名為 array_call_self.sh 的腳本時,如下所示
#!/bin/bash declare -A num word word=( [a]='index_a' [b]='index_b' [c]='index_c' ) num=( [a]=1 [b]=2 [c]=3 ) array=${$1[@]} for i in ${$array[@]};do echo $i done
當我執行
bash array_call_self.sh word
它時返回我test.sh: line 13: ${$1[@]}: bad substitution test.sh: line 14: ${$array[@]}: bad substitution
看起來您可能想要使用名稱引用變數(在
bash
4.3 版或更高版本中可用):#!/bin/bash declare -A num word word=( [a]='index_a' [b]='index_b' [c]='index_c' ) num=( [a]=1 [b]=2 [c]=3 ) declare -n var="$1" printf '%s\n' "${var[@]}"
這將變數聲明
var
為名稱引用變數,引用腳本的第一個參數命名的變數。如果第一個參數不是變數的有效名稱,或者它是 namevar
,那麼您將收到錯誤消息。在聲明
var
並為其分配變數名稱後,訪問其值var
就像您通常訪問命名變數的值一樣。請注意,在腳本的命令行上提供變數的名稱是非常不可用的,您可能希望隱藏此類實現細節並將有效參數限制在有限的列表中,可能通過進行正確的命令行解析。上面的程式碼允許腳本使用者輸出任何腳本的變數。
將值限制為有限列表的簡單方法:
case $1 in (word|num) ;; # ok (*) echo 'error' >&2 exit 1 esac declare -n var="$1"