Shell

將製表符分隔的條目傳遞給 readarray

  • February 24, 2022

顯然我做得不對,但我認為預期的結果很明確(${#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選項從數組元素中刪除分隔符。

引用自:https://unix.stackexchange.com/questions/692018