明らかにしっかりしているわけではありませんが、予想される結果は明らかだと思います( ${#arr[@]}
=3)
$ readarray -d "\t" arr < <(printf "%s\t%s\t%s" "x" "y" "z"); echo "${#arr[@]}"
> 1
ベストアンサー1
\t
シェルはこれがタブでなければならないことを知りません。\
リテラルの後にaが続くものを探しますt
(区切り記号は単一バイト(文字でもない)だけでかまいません。後者は無視します):
$ readarray -d "\t" arr < <(printf %s 'x\ty\tz'); echo "${#arr[@]}"
3
$ typeset -p arr
declare -a arr=([0]="x\\" [1]="ty\\" [2]="tz")
実際のタブでは、次のようにエスケープする必要があります。
$ readarray -d $'\t' arr < <(printf "%s\t%s\t%s" "x" "y" "z"); echo "${#arr[@]}"
3
上記の3番目の値は分離されません。ここでは空ではないので大丈夫ですが、空であれば次のような結果が得られます。
$ readarray -d $'\t' arr < <(printf "%s\t%s\t%s" "x" "y" ""); echo "${#arr[@]}"
2
NULL値を含むすべての値(TABまたはNUL文字を含まない)を受け入れるには、その値が次に区切られていることを確認する必要があります。
printf '%s\t' "$val1" "$val2" "$val3"
それは次のとおりです。
printf '%s\t%s\t%s\t' "$val1" "$val2" "$val3"
readarray
の-t
オプションを使用して、配列要素から区切り文字を削除することもできます。