以下のように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
ベストアンサー1
名前で変数を参照したい場合があります(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
名前参照変数として宣言し、スクリプトの最初の引数として名前が付けられた変数を参照します。最初の引数が変数の有効な名前でない場合、または name の場合、var
エラーが発生します。
変数名を宣言して割り当てた後は、通常、指定された変数の値にアクセスするのと同じようにvar
値にアクセスします。var
提供されますので参考にしてください変数名スクリプトのコマンドラインでは使用できないため、適切なコマンドライン解析を実行してこれらの実装の詳細を非表示にし、有効な引数を制限付きリストに制限できます。上記のコードを使用すると、スクリプトユーザーが出力できます。スクリプトのすべての変数。
値を有限リストに制限する簡単な方法:
case $1 in
(word|num) ;; # ok
(*)
echo 'error' >&2
exit 1
esac
declare -n var="$1"