如何僅使用單一表達式分割指令的輸出並將結果指派給陣列?

如何僅使用單一表達式分割指令的輸出並將結果指派給陣列?

注意:我讀過其他類似問題的答案(如何分割輸出並將其儲存在數組中?,如何在bash中將字串拆分為數組),但他們都沒有回答我在這裡提出的具體問題。


假設某個指令的輸出foo是由 10 個製表符分隔的欄位所組成的單行。然後

tmpvar=$( foo )
fields=( ${(ps:\t:)tmpvar} )
echo $#fields
# 10

問:如何foo在選項卡上實現相同的輸出分割,而不需要中間分配tmpvar


FWIW,這不起作用:

fields=( ${(ps:\t:)$( foo )} )
echo $#fields
# 1

答案1

$ printf '<%s>\n' "${(@ps:\t:)$(printf 'foo bar\t\tbaz')}"
<foo bar>
<>
<baz>

或者,如果您確實想抑制空元素,如 tempvar 方法所示:

$ printf '<%s>\n' ${(ps:\t:)"$(printf 'foo bar\t\tbaz')"}
<foo bar>
<baz>

IOW,您需要引用命令替換。否則,適用於命令替換的分割結果的欄位的s:\t:連接(使用 的第一個字元)。$IFS$IFS

或者,您可以設定$IFS為空字串或單一非空白字元。

$ (IFS=; printf '<%s>\n' ${(ps:\t:)$(printf 'foo bar\t\tbaz')})
<foo bar>
<baz>

答案2

您應該引用 $( foo )

fields=( ${(ps:\t:)"$( foo )"} )
echo $#fields

你可以找到這裡有一些很好的例子

答案3

IFS=" "; set -f
a=( $(echo -e "a b\tc d") )
printf '<%s>\n' "size=${#a[@]}" "${a[@]}"

相關內容