将制表符分隔的条目传递给 readarray

将制表符分隔的条目传递给 readarray

显然我做得不对,但我认为预期的结果很明确(${#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选项从数组元素中删除分隔符。

相关内容