他の人が指摘しているように、読み込みエコーループの代わりにcatまたはawkを使用する方がはるかに良い方法です。空白トリミングの問題(およびあなたが遭遇しなかった他のいくつかの問題)より速く走り、少なくとも猫では、よりクリーンなコードです。それにもかかわらず、私は読み込みエコーループを正しく動作させるために挑戦したいと思います。
まず、ホワイトスペーストリミングの問題:readコマンドは、先頭と末尾の空白を自動的に切り詰めます。これは、IFS変数を空白に設定することによって空白の定義を変更することで修正できます。また、readは、行末のバックスラッシュは次の行が継続行であることを意味し、この行と一緒にスプライスする必要があります。これを修正するには、-r(生)フラグを使用します。 3番目の問題は、エコーの多くの実装が文字列のエスケープシーケンスを解釈することです(例えば、\ nが実際の改行に変わる可能性があります)。これを修正するには、代わりにprintfを使用してください。最後に、一般的なスクリプティングの衛生ルールと同じように、実際には必要ないときはcatを使用しないでください。代わりに入力リダイレクトを使用してください。これらの変更により、内側のループは次のようになります。
while IFS='' read -r line; do
printf "%s\n" "$line">>$OUTPUT
done <$f
は...また、周囲のスクリプトを使用して、他の問題がいくつかあります:使用可能な.textileファイルのリストなどのファイルを定義しようとしているラインそれは決して実際のファイルリストに展開されません。これを行うための最善の方法は、配列を使用することです:場合には、二重引用符で囲む必要があるファイル名のいずれかを
FILES=(../best-practices/*.textile)
...
for f in "${FILES[@]}"
(と$ fのすべての出現を持っている彼らにスペースや他の変な文字が - 本当にすべき$ OUTPUTでもこれを実行してください。スクリプトで定義されているので実際には終了しても安全です。)
最後に、出力ファイルをすべて消去するループオーバーファイルの最上部付近にecho "">$OUTPUT
がありますtime through(つまり、最後には最後の.textileファイルのみが含まれます)。これをループの前に移動する必要があります。ファイルの先頭に空白行を1つ入れたり、ファイルの間に3つの空白行(最初と最後の2つ)を入れるのがここで意図しているのかどうかはわかりません。適切な交換が行われます。 、
#!/bin/sh
OUTPUT="../best_practices.textile"
FILES=(../best-practices/*.textile)
: >"$OUTPUT"
for f in "${FILES[@]}"
do
echo "Processing $f file..."
echo >>"$OUTPUT"
while IFS='' read -r line; do
printf "%s\n" "$line">>"$OUTPUT"
done <"$f"
echo >>"$OUTPUT"
echo >>"$OUTPUT"
done
これも空白を抹消します。私は、それが私に先導的なスペースを節約するためのより多くのオプションを与えるかどうかを見るために行ごとに切り替えました。 –
それは空白を殺しません。ありがとう男:> –
面白いです。この回答は、説明なしで2回下降しています。あなたがdownvoteに行くなら、なぜ言う。 (そして、それがあなたが「これはちょうど1つのcatコマンドかもしれない」と思っているからです:1.本当に、ファイルと2の間に挿入された余分な空白行を書き留めておいてください。簡単にするために、実際のバージョンにはファイルごとにロジックが追加されるかもしれません)。 –