部分文字列に基づいて連想配列を繰り返します。

部分文字列に基づいて連想配列を繰り返します。

以下のコードでは、ループにいくつかの連想配列を作成します。これは、文字列識別子と年という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_1999JF-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は連想配列をある程度サポートします。彼らがあなたのために働くかどうかは別の質問です。とにかく、他のシェルに移植することはできません。

おすすめ記事