2017-03-05 21 views
1

globから派生したファイル名をキーとして連想配列をBashに作成したいとします。ここで私はやっているものです:glob出力を持つBash連想配列の作成

declare -A file_hash 
for file in *; do 
    file_hash+=([$file]=1) 
done 

私は同じことをやって、より簡単な方法がある場合は、多少、我々はこのよう通常の配列を初期化する方法のように、見て好奇心:

file_array=(*) 

私はSOにanotherポストから得たアイデアの一つは、次のとおりです。

file_array=(*) 
declare -A file_hash=($(echo ${file_array[@]} | sed 's/[^ ]*/[&]=&/g')) 

ことが最善の方法ですか?

+2

エコーメソッドからインスピレーションを得て、これはいくつかのテストでは問題なく動作しますが、evalを必要とします: 'declare -A filehash; eval $(printf 'ファイルハッシュ+ =(["%s"] = 1);' * .txt) ' –

答えて

2

これを行うには、ループが正しい方法です。何か他のリスクが適切に

file_array=(*)作品より長く、より多くのショートカットとしてなど、*[]?のようなシェルは、特別に、すなわち空白治療も文字を含むファイル名(改行特に)とグロブメタ文字を処理していません明示的な形式

file_array=([0]=file1 [1]=file2 ...) 

インデックス0,1、...はグロブ拡張からのファイルのシーケンスから推測できるためです。連想配列では、そのような前提を作ることはできず、キーと値を明示的に指定する必要があります。