1

私の一部は次のmakefileとおりです。

list:          all
               for f in \
               `less fetch/list.txt`; \
               do \
                    echo $$f; \
                    ...
               done

fetch/list.txtファイルのリストが含まれています:

path/file1.ml
path/file2.ml
path/file 3.ml
path/file 4.ml

問題は、ファイル名にスペースが許可されていても、次のようにmake list表示されることです。

path/file1.ml
path/file2.ml
path/file
3.ml
path/file
4.ml

スペースに関係なく、各行を完全に読み取らせることを知っている人はいますか?

4

6 に答える 6

5

これを行う1つの方法は次のとおりです。

list:
        while IFS= read -r n ; do echo "line: $$n" ; done < list.txt

これが実際の動作です:

$ cat list.txt 
abc
def
123 456

$ gmake
while read n ; do echo "line: $n" ; done < list.txt
line: abc
line: def
line: 123 456
line: 
于 2013-11-09T23:37:33.073 に答える
1

これはあなたのために働くかもしれません:

for file in "$(<list.txt)"; do echo "$file"; done
于 2013-11-10T07:49:56.960 に答える
1

スペースを含む可能性のある変数を操作する場合は、スペースを保持するために変数を引用符で囲む必要があります。これは機能します。たとえば、次のようになります。

for f in "$(cat fetch/list.txt)"; do     # preserve spacing from $()
    echo "$f"                            # preserve spacing from $f
done

別のいくつかの提案:

  • 引用符と入れ子でうまく機能するため$(...)、バッククォートよりもコマンド置換を優先します。`...`
  • lessはインタラクティブなコマンドcatです。ファイルの内容だけが必要な場合は、代わりに使用してください。

ただし、ファイルを要素のリストに変換して反復するのではなく、ファイルの内容を直接ループする方が効率的です (Eric の回答で既に述べたように)。

while read f; do           # read each line into f
    echo "$f"
done < fetch/list.txt      # from fetch/list.txt

ここで、readは行全体を読み取ります (一方、プロセス置換とバッククォートはアイテムのリストを生成しますが、引用しない限り、必ずしも行ではありません) $f<入力リダイレクトの場所に注意してください:doneキーワードの後です。これは紛らわしいかもしれません。

于 2013-11-10T00:14:12.770 に答える