Erwann Asked: 2022-02-25 07:59:57 +0800 CST2022-02-25 07:59:57 +0800 CST 2022-02-25 07:59:57 +0800 CST 将制表符分隔的条目传递给 readarray 772 显然我做得不对,但我认为预期的结果很明确(${#arr[@]}=3) $ readarray -d "\t" arr < <(printf "%s\t%s\t%s" "x" "y" "z"); echo "${#arr[@]}" > 1 shell array 1 个回答 Voted Best Answer terdon 2022-02-25T08:07:03+08:002022-02-25T08:07:03+08:00 外壳不知道这\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'-t选项从数组元素中删除分隔符。
外壳不知道这
\t
应该是一个选项卡。它正在寻找一个\
后跟a 的文字t
(忽略后者,因为分隔符只能是单个字节(甚至不是字符)):对于实际的选项卡,您需要像这样转义:
请注意,上面的第三个值没有分隔。这里很好,因为它不是空的,但是如果它是空的,你会得到:
要允许包括空值在内的任何值(不包含 TAB 或 NUL 字符),您需要确保它们用以下内容分隔:
如同:
您可能还想使用
readarray
'-t
选项从数组元素中删除分隔符。