Bashシェルで同等のデータ構造を設定しますか?

Bashシェルで同等のデータ構造を設定しますか?

データ構造が次のような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も広く使われています。

おすすめ記事