Shell
將製表符分隔的條目傳遞給 readarray
顯然我做得不對,但我認為預期的結果很明確(
${#arr[@]}
=3)$ readarray -d "\t" arr < <(printf "%s\t%s\t%s" "x" "y" "z"); echo "${#arr[@]}" > 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
請注意,上面的第三個值沒有分隔。這裡很好,因為它不是空的,但是如果它是空的,你會得到:
$ 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
選項從數組元素中刪除分隔符。