Bash:連想配列のキーとしてスペースを使用する

Bash:連想配列のキーとしてスペースを使用する

このコードはBashで

s="There are seven pencil"
declare -A A
while IFS= read -rn1 a; do
 [ -z "$a" ] || [ -n "${A[$a]}" ] && continue
 printf %s "$a"
 ((A[$a]++))    # A[$a]=x
done <<<"$s"
echo

この行を作成

Ther a svn pcil

すべての空白が印刷されます。この動作は文書化されているか、別の方法で予想されますか?

ただし、((A[$a]++))に変更すると、A[$a]=x出力は次のように変わります。

Ther asvnpcil

したがって、今回は最初のスペースのみが印刷されます。

違いは何ですか?

これはGNU bashバージョン4.4.12(1)リリース(x86_64-pc-linux-gnu)にあります。


比較できる3番目のタスクがありますが、奇妙なlet "A[$a]=x"ことに、最初の2つのタスクの間のどこかにあります。つまり、すべての空白を含む行を作成します。Ther a svn pcil。しかし、使用量が減ります。イサクの答えA[$a]=x、割り当てのように動作します。

$ unset A; declare -A A; let "A[' ']++"; declare -p A
declare -A A=([" "]="1" )

最後にバグレポートを送信しました。これがそのスレッドです。

ベストアンサー1

重要な問題は、算術を使用して変数を宣言することです。

変える:

(( A[$a]++ ))

そして

declare -A A["$a"]=1

そして重複したスペースは削除されます。


私の考えでは、これはバグです。スペースは変数を作成できません。

$ declare -A A; (( A[" "]++ )); declare -p A
declare -A A

上記の回答を投稿した後に編集内容を解決するには:

違いは何ですか?

代入は変数を配列の一部として宣言します。

$ unset A; declare -A A; A[" "]=1 ; declare -p A
declare -A A=([" "]="1" )

そして算術拡張失敗する同じことを行います。

$ unset A; declare -A A; (( A[" "]=1 )); declare -p A
declare -A A

おすすめ記事