データ構造が次のようなbashスクリプトを持っていますか?java.util.Set使用しますか?デフォルトでは、重複した要素を追加しても同じ2つの要素を追加できないコレクションはありますか?
私は複雑なものを保存したくなく、文字列セットだけを保存したいと思います。
また、存在する場合は特定のバージョンのbashが必要ですか、それともPOSIX互換ですか?
私はbashに配列があり、いくつかのbashバージョンにはハッシュマップがあることを知っています(すべてではありません)。
ベストアンサー1
文字列セットにのみ興味がある場合は、次のものを使用できます。連想配列("ハッシュマップ"):
declare -A hm
hm[hello]=1
hm[world]=1
hm[hello]=1
if [ "${hm[hello]}" ] ; then ... ; fi
あなたが興味を持っているのは、キーに関連するものがあるかどうかだけです。値は重要ではありません。そこに空でない文字列があることに注意してください。したがって、項目を空の文字列に設定して「削除」することができます。
HashMap<String,Object>
これは、集合を表すためにaを使用するのと似ています(実際にはJavaのHashSetは何をしますか?、実際に)。
これらの連想配列は、Bash 4 以降および zsh および ksh で使用できます。 MacOS用のBash 3.2を含む、Series 3 Bashバージョン以下には適用されません。
POSIXに該当するものはありません。効果をシミュレートできます。使用eval
文字列が適切に制限されている場合、または有効な変数名に自然に変換される場合:
hm_hello=1
hm_world=1
key=test
eval "hm_$key=1"
if [ "$(eval hm_$key)" ] ; then ... ; fi
一時ファイルを使用することもできますgrep
たとえば、多数の一時ファイルとファイルシステムもキーとして保存されます。
シェルスクリプト以外のツールや言語がより適している可能性があります。最低限度では、awk
すべてのPOSIXシステムに適用されます。文字列キー連想配列をサポートします。
複雑なデータ構造が必要な場合は、既存の汎用言語がより適している可能性があります。 PerlとPythonも広く使われています。