シェルスクリプト:特定のグローバル変数を選択するには、keywardを使用します。

シェルスクリプト:特定のグローバル変数を選択するには、keywardを使用します。

シェルスクリプトに同じパターンを持つグローバル変数が複数あります。たとえば、次のようになります。

VALID_DOMESTIC_ANIMAL=(cat dog)
VALID_ACQUATIC_ANIMAL=(shark dolphin)

これでACQUATIC / DOMESTICである可能性がある別のパラメーターCATAGORYがあります。繰り返す予定のグローバル変数を選択するには?次のコードを試しました。

#!/bin/bash
VALID_DOMESTIC_ANIMAL=(cat dog)
VALID_ACQUATIC_ANIMAL=(shark dolphin)

CATAGORY=ACQUATIC
VALID_CATAGORY_ANIMAL=VALID_${CATAGORY}_ANIMAL
#echo "VALID_CATAGORY_ANIMAL ${VALID_CATAGORY_ANIMAL}"
for anime in "${VALID_CATAGORY_ANIMAL[@]}"; do
    echo "${anime}"
done

出力を期待していましたが、shark dolphin結果が出ました。VALID_ACQUATIC_ANIMAL

同じ名前の変数が存在する場合は、それを使用するようにbashスクリプトにどのように指示しますか?

答え1

ありがとうスチールドライバー進む道を指す変数 - 和集合。私はnamerefを使用していますが、私には効果的です。次の変更を実行すると成功しました。

-VALID_CATAGORY_ANIMAL=VALID_${CATAGORY}_ANIMAL
+declare -n VALID_CATAGORY_ANIMAL=VALID_${CATAGORY}_ANIMAL

答え2

これにより、状況がより明確になります。この変数には他の変数の名前が含まれています。その値を取得するには、シェルはまず変数名を拡張してから変数値を拡張する必要があります。

for anime in $(eval echo \${$VALID_CATAGORY_ANIMAL[@]}); do

eval- 変数を拡張して実行のためにシェルに渡すには引数が必要です。
最初のドル記号をエスケープしたので、コマンドは次のように実行されます。

$(echo ${VALID_ACQUATIC_ANIMAL[@]}

ループの前に次の行を挿入できます。

echo $VALID_CATAGORY_ANIMAL    #VALID_ACQUATIC_ANIMAL
echo \${$VALID_CATAGORY_ANIMAL[@]}    #${VALID_ACQUATIC_ANIMAL[@]}
eval echo \${$VALID_CATAGORY_ANIMAL[@]}    #shark, dolphin

関連情報