パラメータをスクリプトの内部配列名として使用するには?

パラメータをスクリプトの内部配列名として使用するには?

以下のように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"

おすすめ記事