
このスクリプトのエラーはどこですか?
#!/bin/bash
rep="git"
files=`find' ${rep} '-type f`
for f in ${files} do
echo $f
done
find git -type f
シェルから単独で実行すると動作します!
答え1
一重引用符で囲まれた文字列は挿入されません。これはあなたが走ろうとしていることを意味します。
find ' ${rep} '-type f
一重引用符を削除します。 $repを引用する必要がある場合(たとえば、スペースが含まれている場合)、二重引用符を使用してください。
files=`find "$rep" -type f`
二重引用符内にスペースはありません。 「git」ではなく「git」を検索していますか?
答え2
出力をfind
変数に保存しないでください。これは信頼できず、非効率的です。find
出力処理を開始する前に実行を完了する必要があるため、非効率的です。これは大規模なディレクトリツリーに影響します。コマンド構文が正しい場合でも、出力は改行区切りのfind
ファイル名のリストで構成されているため、信頼できません。ファイル名に改行文字が含まれていないことがわかっていない場合、これはあいまいです。また、出力を正しく解析しません。引用符なしでコマンド置換を使用すると、空白があるたび$(…)
にコマンドの結果が別の単語に分割され(単に改行ではなく)、その単語はシェルglobパターンとして解釈されます。この処理を回避するには、"$(…)"
(変数とコマンドの置換の周りに常に二重引用符:"$foo"
、"$(foo)"
)を使用してください。ファイル名を区切る必要があるため、ここではうまくいきません。
find
生成されたファイルを処理する組み込み関数であるタスクが-exec
あります。それを書いてください。それがまさにその目的です。
find "$rep" -type f -exec echo {} \;
単一のコマンドではなく、各ファイルでランダムなシェルフラグメントを実行する必要がある場合は、シェルをコマンドとして呼び出します。誤ったファイル名を回避するには、そのファイル名をシェルに引数として渡します。
find "$rep" -type f -exec sh -c '
echo "$0"
# more shell commands ...
' {} \;
答え3
引用符の削除
file=``$rep' を探す - タイプ f`
正しいスクリプトは
#!/bin/bash 担当者="git" file=`$rep -type f を探す` $ {files}のfについて。 エコ$f 完璧
答え4
'
前後にスペースを追加-type