単一の式のみを使用してコマンド出力を分割し、その結果を配列に割り当てるにはどうすればよいですか?

単一の式のみを使用してコマンド出力を分割し、その結果を配列に割り当てるにはどうすればよいですか?

気づく:同様の質問に対する他の答えを読んだ。出力を分割して配列に保存する方法は?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[@]}"

関連情報