タブで区切られた項目をreadarrayに渡す

タブで区切られた項目をreadarrayに渡す

明らかにしっかりしているわけではありませんが、予想される結果は明らかだと思います( ${#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オプションを使用して、配列要素から区切り文字を削除することもできます。

おすすめ記事