2016-08-26 4 views
3

連想配列のキーとしてファイル名を使用するbashスクリプトがあります。ファイル名の中には引用符が含まれているため、それらを設定解除する方法が見つからないようです。ここでキーに引用符が含まれている場合、連想配列の値を設定解除する

は、端末から問題を複製する例を示します

$ declare -A x 
$ y="key with spaces" 
$ z="key with spaces and ' quote" 
$ x[$y]=5 # this works fine 
$ x[$z]=44 # as does this 
$ echo "${x[$y]}" "${x[$z]}" # no problems here 
5 44 
$ unset x["$y"] # works 
$ unset x["$z"] # does not work 
bash: unset: `x[key with spaces and ' quote]': not a valid identifier 
$ echo "${x[$y]}" "${x[$z]}" # second key was not deleted 
44 

私のスクリプトで処理されたファイル名、少なくともする必要があり、合理的な範囲(任意であり、関係なく、彼らはそれらに持っているもの、文字の作業する必要があります印刷可能な文字で作業します)。unsetは、特定のプロパティを持つファイルのフラグをクリアするために使用されます。

これらの特定のキーに引用符が含まれている可能性がある場合、bashを解除するにはどうすればよいですか?

+0

あなたの代わりに未設定のそれに空の文字列を割り当ててもらえますか? – Barmar

+0

@Barmar残念ながら、私の場合は値がユーザー提供であり、理論的には空である可能性があるため、私の場合はうまくいきません。私が今考えることのできる主な回避策は、 'isunset [$ key] = 1'のような追加の配列を持つことです。 – codebeard

+2

これは私のバッシュバグのようですが、この特定の事例への他の参照は見つかりません。 – Barmar

答えて

2

のように書くことができ、私はこの作品を見つけます私のために:

unset 'x[$z]' 
これは、他の特殊文字のために働く

$ y="key with spaces" 
$ v="\$ ' \" @ # * & \`" 
$ x[$y]=5 
$ x[$v]=10 
$ echo ${x[*]} 
5 10 
$ unset 'x[$v]' 
$ echo ${x[*]} 
5 
+1

ニース。 'unset'はその引数を使ってある程度の拡張をしているようです。私はこれがどこにも書かれていないと確信しています。 – chepner

1

これはバグかもしれません(少なくとも、不便です)。修正プログラムが利用可能になるまで、あなたがbash 4.4で

$ unset x["$(printf '%q' "$z")"] 

$zのシェル引用されたバージョンを取得することによってこの問題を回避することができ、これは、より簡単に

$ unset x["${[email protected]}"] 
2

これは、これは動作するはずですので、同様連想配列のキーの仕事の周りの単一引用符の場合です:

$> declare -p x 
declare -A x='(["key with spaces and '\'' quote"]="44")' 

$> unset x['$z'] 

$> declare -p x 
declare -A x='()' 
+1

これが動作していることを確認できます。ありがとうございます。それは本当に奇妙に思えますが、あなたが '$ 'でキーを持っていたらどうしますか? – codebeard

+0

私はこれを 'z = 'キーでスペースでテストしました。\ $と' quote ''と 'unset x [' $ z ']'はまだまだ問題ありません。 – anubhava

+0

私はあなたが 'declare -A x = '([\ $ z] =" 5 ")''を持っていて 'unset x ['$ z']'でそれを解除したいと思っていたが、 'unset x ['\ $ z']' – codebeard

関連する問題