「readarray」で構成された配列要素が二重引用符で囲まれているときに仮想の\ nを取得するのはなぜですか?

「readarray」で構成された配列要素が二重引用符で囲まれているときに仮想の\ nを取得するのはなぜですか?

readarray私は根本的な原因を知らない行動を見つけました。

以下のコード:

readarray array < <(echo -e "Jenny\nJane\nJessica")

echo "* Not enclosed:"
for ((i=0; i<${#array[@]}; i++)); do
    echo ${array[$i]}
done

echo "* Enclosed:"
for ((i=0; i<${#array[@]}; i++)); do
    echo "${array[$i]}"
done

次の出力が生成されます。

* Not enclosed:
Jenny
Jane
Jessica
* Enclosed:
Jenny

Jane

Jessica

" "要素がこんなに囲まれたら、なぜ間隔が広がるのでしょうか?変数を次のように置き換えて
も:echo "${array[$i]}"

foo=${array[$i]}
echo "$foo"

出力はまだ間隔を置いています。
ただし、一般的な方法で配列を宣言すると、array=("Jenny" "Jane "Jessica")引用符に関係なくスペースは挿入されません。

これが問題を引き起こす理由は、配列を繰り返しながら文から要素を取得してエコーする必要があるからです。たとえば、

readarray array < <(echo -e "Jenny\nJane\nJessica")
for ((i=0; i<${#array[@]}; i++)); do
    echo "Hello, ${array[$i]}!"
done

しかし、${array[$i]}その間に何かが" "挿入\nされ、出力は次のようになります。

Hello, Jenny
!
Hello, Jane
!
Hello, Jessica
!

答え1

-tこれは、readarrayがこのオプションで呼び出されない限り、区切り文字(デフォルトでは改行文字)を削除しないためです。

配列値を印刷するより簡単なdeclare -p var方法については、以下を見てください。

$ readarray array < <(echo -e "Jenny\nJane\nJessica")
$ declare -p array
declare -a array=([0]=$'Jenny\n' [1]=$'Jane\n' [2]=$'Jessica\n')

各要素の末尾の改行文字を表示できます。

しかし、これは:

$ readarray -t array < <(echo -e "Jenny\nJane\nJessica")
$ declare -p array
declare -a array=([0]="Jenny" [1]="Jane" [2]="Jessica")

末尾の改行文字はありません。

引用符なしで変数拡張を使用するのは悪い考えです。しないでください。

関連情報