このコードは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