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")
末尾の改行文字はありません。
引用符なしで変数拡張を使用するのは悪い考えです。しないでください。