显然我做得不对,但我认为预期的结果很明确(${#arr[@]}
=3)
$ readarray -d "\t" arr < <(printf "%s\t%s\t%s" "x" "y" "z"); echo "${#arr[@]}"
> 1
答案1
shell 不知道这\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
请注意,上面的第三个值没有分隔。这里很好,因为它不是空的,但如果它是空的,你会得到:
$ readarray -d $'\t' arr < <(printf "%s\t%s\t%s" "x" "y" ""); echo "${#arr[@]}"
2
要允许任何值(不包含 TAB 或 NUL 字符),包括空值,您需要确保它们用以下命令分隔:
printf '%s\t' "$val1" "$val2" "$val3"
与...一样:
printf '%s\t%s\t%s\t' "$val1" "$val2" "$val3"
您可能还想使用readarray
's-t
选项从数组元素中删除分隔符。