以下のコードでは、ループにいくつかの連想配列を作成します。これは、文字列識別子と年という2つの文字列で構成されています。一度作成したら、識別子だけに基づいてループ内の配列にアクセスしたいと思います。
#!/bin/bash
# Declare associative arrays of journal-year combinations
A_JOURNAL_LIST={JF,JFE,RFS}
B_JOURNAL_LIST={JBF,JFI,JMCB}
ALL_JOURNAL_LIST={JF,JFE,RFS,JBF,JFI,JMCB}
for year in {1998..2000} {2009..2011}
do
eval "A_$year=($A_JOURNAL_LIST-$year) ;"
eval "B_$year=($B_JOURNAL_LIST-$year) ;"
eval "all_$year=($ALL_JOURNAL_LIST-$year) ;"
done
A_1999
JF-1999 JFE-1999 RFS-1999
ここでは、たとえば、次のように拡張された複数の配列を簡単に取得できます。
for journal in A B all
do
echo "${'$journal'_1999[@]}"
done
期待した
JF-1999 JFE-1999 RFS-1999
JBF-1999 JFI-1999 JMCB-1999
JF-1999 JFE-1999 RFS-1999 JBF-1999 JFI-1999 JMCB-1999
私はbad substitution error
いつも1つを取得し、多くの組み合わせを試しています。何が問題なの?
ベストアンサー1
へようこそeval
地獄!一度使い始めると、決して削除できません。
for journal in A B all
do
eval "echo \"\${${journal}_1999[@]}\""
done
これを行うより良い方法があるかもしれませんが、シェルスクリプトで連想配列や他の入れ子になった配列を使用することは決して面倒ではありません。これらのデータ構造が必要な場合は、デフォルトでそれをサポートするスクリプト言語を使用する方が良いかもしれません。
実際、bashは連想配列をある程度サポートします。彼らがあなたのために働くかどうかは別の質問です。とにかく、他のシェルに移植することはできません。