気づく:同様の質問に対する他の答えを読んだ。出力を分割して配列に保存する方法は?、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
答え3
IFS=" "; set -f
a=( $(echo -e "a b\tc d") )
printf '<%s>\n' "size=${#a[@]}" "${a[@]}"