回答:
まず、の使用ls
は単なる例であると想定します。ls
あいまいであるため、どのシェルでもの出力を解析できません。これがニュースである場合、なぜls(1)の出力を解析すべきでないのかを読んでください。任意のシェルで、ファイルのリストを取得するには、ワイルドカードを使用しますfiles=(*)
。
zshでは、他のシェルと同様に、コマンド置換の結果は空白文字で単語に分割されます(より正確には、の値に従ってIFS
)。(他のシェルとは異なり、コマンド置換の結果はzshでのグロビングの影響を受けません。)したがって、ls
コマンドの出力が
hello world
wibble
次いでfiles=($(ls))
設定files
3つの要素を含むようにアレイを:hello
、world
およびwibble
。
コマンド置換が二重引用符で囲まれている場合、分割は実行されません。パラメータ展開フラグを使用してカスタム分割を実行できます。@
フラグを使用して、分割の結果が配列になることを示します(奇妙なことに、展開は二重引用符で囲む必要があります。つまり"${(@)…}"
、二重引用符で囲まれた文字列は複数の単語に展開されます)。分割するには、s
フラグを使用"${(@s:,:)…}"
します。たとえば、コンマで分割します。f
フラグは改行で分割します。
files=("${(@f)$(ls)}")
空の要素を取り除くためfor f in $files[@]
、一般的に配列を反復する適切な方法はであることに注意してください$files
(ここでは、要素は空にならないので問題ではありません)。
print $f
$f
で始まり、-
バックスラッシュを展開すると、スイッチとして解釈され$f
ます。を使用するprint -r -- $f
かprint -rn -- $f
、文字列の後に改行を追加したくない場合。
(…)
が必要なのfiles
は、それが文字列ではなく配列であるためです(これには、コマンドによる行の連結が含まれ、によって行われた分割が取り消されます(f)
)。2. foo=$'one\n\nthree', contrast
print -rl $ {(f)foo} `およびprint "${(@f)foo}"
。二重引用符は、空の行を保持するために必要です。空行は、そこから取得するls
ことはできませんが、他のコマンドで発生する可能性があります。