4

このようなforループでは、

for i in `cat *.input`; do
    echo "$i"
done

入力ファイルの1つに、のようなエントリが含まれている*a場合は、「a」で終わるファイル名を指定します。

このファイル名の拡張を防ぐ簡単な方法はありますか?

複数のファイルを使用するため、グロブ(set -o noglob)は適切なオプションではありません。catの出力をフィルタリングして特殊文字をエスケープすることもできるはずですが、

for i in `cat *.input | sed 's/*/\\*'`
    ...

まだ*a拡大を引き起こしますが

for i in `cat *.input | sed 's/*/\\\\*'`
    ...

私に与えます\*a(バックスラッシュを含む)。[これは別の質問だと思いますが]

4

2 に答える 2

5

これにより、すべてのファイルcat内容が繰り返され、結果の行が繰り返されます。

while read -r i
do
    echo "$i"
done < <(cat *.input)

ファイルにグロビング文字が含まれている場合、それらは展開されません。それらのキーはfor、変数を使用せず、引用符で囲むことです。

プロセス置換をサポートしないBourne派生シェルでは、これは同等です。

cat *.input | while read -r i
do
    echo "$i"
done

Bashでこれを行わない理由は、サブシェルが作成され、サブシェル(ループ)が終了すると、内部に設定された変数の値とcdディレクトリの変更が失われるためです。

于 2011-02-24T23:26:10.650 に答える
0

あなたが持っている例では、単純なcat *.inputものは同じことをします。

于 2011-02-24T23:25:56.453 に答える