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も広く使われています。

答え2

次の文字列セットのようなものbash

  1. 処理する改行セットで区切られた文字列sort -u

  2. 関連配列のキーセット(バージョン4.0以降)。

bash実際、JavaはJavaほど汎用性の高いプログラミング言語ではないため、これを使用して一般的なプログラミングを実行するにはかなりの困難が必要です。特に、基本配列よりもエキゾチックなデータ構造が必要な場合にはさらにそうです。

の配列と関連配列はbashPOSIXシェル標準の拡張です。 POSIX シェルには 1 つの配列 ( $@) のみがあり、関連配列はありません。

関連情報