2016-04-01 10 views
0

私はbashスクリプト内で、次のようないくつかのコード持ってfindコマンドの一部のために引用し:bashの変数展開と

FileNames="" 
while read -r FileName; do 
    ... 
    FileNames+=" -o -iname \"$FileName\"" 
    ... 
done <"$ListOfFileNames" 
FileNames="${FileNames# -o }" 
find foo -type f \($FileNames \) 
私はいくつかのファイル名にスペースが含まれていることが判明するまで、これは一般的に私のために働いていた

を(そしておそらくその他の特殊文字)。これらのケースをカバーするために$FileNameの使用に関する追加の引用符を追加すると、findコマンド内の$FileNamesの拡張が不正に始まります。私は引用やエスケープのさまざまな方法を試して、空になった。私が書いた他の多くのスクリプトでは、他の多くの方法で変数をうまく使用していますが、これは私を困惑させています。私はCygwinの下でスクリプトを実行しています。これを処理する良い方法がありますか?

+0

私はちょうどこの自分への答えを探していました。 [ここに行く](参照:http://stackoverflow.com/a/143172/6142694) –

+0

あなたが提供するリファレンスは、私が検索した方法では表示されませんでしたが、基本的に同じ問題です。しかし、ネストされた展開を引用したり、変数の一部を削除したりする必要がないので、正確に重複しているとは言えません(最初に配列メソッドを試したときに間違っていました)。 – knokej

+0

ダニエル、私はあなたのリンクが私に送った場所がコマンド内の変数の拡張で私の問題を説明しているのを実際には見ていませんでしたが、今はブリッジ下の水です。 – knokej

答えて

0

アレイを使用してください。配列は空白をはるかに良く扱うことができます。安全性をさらに高めるには、先頭の空白をreadに保存するためにIFS=を使用してください。

FileNames=(-false) 
while IFS= read -r FileName; do 
    ... 
    FileNames+=(-o -iname "$FileName") 
    ... 
done < "$ListOfFileNames" 
find foo -type f \("${FileNames[@]}" \) 
+0

Johnさん、ありがとうございます。これは、 'FileNames =" $ {FileNames#-o} "の機能を正しく取得する方法を理解しなければなりませんでした。最初は、最初の配列要素を ""に設定しましたが、うまくいきませんでした。 'unset'が動作しました。 – knokej

関連する問題