これまで2時間の間zshスクリプトを学びました。空白がある可能性があるファイルのリストを見つけたいです。私はzshである限り、以下の例にはまったく異なるアプローチを使用できます。なぜなら、zshは私がスクリプトを書くのではなく、私が作業しているからです。
files=(`ls`)
for f in $files; do
print $f
done
明らかに私は単に再構築するのではなく、ループが繰り返されるたびにフルファイル名をキャプチャls
したいと思います。$f
答え1
まず、使用法はls
単なる例であると仮定します。ls
あいまいなので、どのシェルでも出力を解析できません。読むls(1) の出力を分析しない理由これがあなたにニュースなら。すべてのシェルからファイルのリストを取得するにはfiles=(*)
。
zshでは、他のシェルと同様に、結果は次のようになります。コマンドの置き換え空白文字から単語に分割します(より正確には値に基づいてIFS
)。 (他のシェルとは異なり、コマンド置換の結果はzshのglobbingの影響を受けません。)したがって、コマンドの出力が次のようなls
場合
hello world
wibble
次に、および3つの要素を含むように配列をfiles=($(ls))
設定します。files
hello
world
wibble
コマンド置換を二重引用符で囲むと、分割は行われません。カスタム分割を実行できます。パラメータ拡張フラグ。この@
フラグを使用して、分割結果が配列であることを示します(異常には拡張を二重引用符で保持する必要があります。つまり、二重引用符で囲まれた"${(@)…}"
文字列も複数の単語に展開されます)。分割の場合は、コンマで分割などのs
フラグを使用してください"${(@s:,:)…}"
。このf
フラグは改行でのみ分割されます。
files=("${(@f)$(ls)}")
通常、配列を繰り返す正しい方法は空の要素をfor f in $files[@]
削除することです$files
(ここでは要素が空ではないため、これは重要ではありません)。
print $f
aで始まり、バックスラッシュを拡張すると、$f
スイッチとして解釈されます。文字列の後に改行文字が必要ない場合は、またはを使用してください。-
$f
print -r -- $f
print -rn -- $f
答え2
zsh では、デフォルトでは単語分離を行わないシェル拡張を使用できます。努力する
for f in /path/to/files/*; do
print ${f}
done