2016-05-22 5 views
-2

私のコースでカバーされていない内容の古い過去の質問が見つかりました。私はそれで調べることはできませんが、このbashスクリプトは何をしますか?私はgrepがユーザーの入力を受け取り、入力を含む行を出力し、エコーは入力を繰り返し、catは入力を表示することを知っています。しかし、私はこれが全体として何をするのか考えています。助けてください?このbashスクリプトの各行は何をしますか?

#!/bin/bash 

outputFile=$1 
for file in $(find -name '*txt' | grep data) 
do 
    echo $file >> $outputFile 
    cat $file >> $outputFile 
done 
+0

が見えます。 –

+1

これは、ファイル名に空白が含まれているファイルを結合します。私はこのコードがあなたのコースインストラクターによって書かれていないことを願っています。 – John1024

+0

http://explainshell.com/ – Cyrus

答えて

1

各ライン:

#!/bin/bash 

は、スクリプトに渡される最初のパラメータに "OUTPUTFILE" という名前の変数を設定してbashの

outputFile=$1 

を使用するスクリプトをハッシュ強打。スクリプトを実行すると、このディレクトリ内のすべてのファイルを介してbash myScript.sh "/some/file/to/output.txt"

for file in $(find -name '*txt' | grep data) 
do 

ループのようになり、それがサブディレクトリ文字「TXT」で終了し、名前の文字「データ」どこかを含むファイルを探しています。見つかったループ/ファイルのための反復ごとに、変数「ファイル」にファイル名を設定

echo $file >> $outputFile 

OUTPUTFILEに/印刷変数「ファイル」に記憶されたファイル名をエコー

cat $file >> $outputFile 

ファイルの内容を取り出し、outputFileに貼り付けます。

done 

は、しかし、このスクリプトでいくつかの問題がありますForループ

を終了します。 $ outputFileまたは$ fileの名前またはパスに空白があると、失敗します。

cat "$file" >> "$outputFile" 
+0

ご協力いただきありがとうございます! – Tai

+0

$ file(find -name '* txt' | grep data) 'の行の' _word splitting_ '行が以前に実行されていたため、変数 'file'にはスペースは含まれません。 – John1024

+0

真ですが、単語分割とグロブ展開の後、スクリプトはファイルではない '$ file'の値で終わることがあります。その時点で' cat'が失敗します。 – kojiro

1
#!/bin/bash 

シェバング:それはのような変数を二重引用符を投げるようにするとよいでしょう。このスクリプトが./this_scriptのように直接起動されるか、PATHに見つかった場合は、/bin/bashで起動されます。

outputFile=$1 

outputFileに最初の引数を割り当てます。

++ find -name '*txt' 

「txt」で終わる名前のすべてのファイルを再帰的にリストします。パスを含めてfind . -name '*.txt'と書くのがより標準的です。

+ … | grep data 

前のファイル名のリストをフィルタリングします。名前に文字列 "data"を含むものだけをリストします。このパイプは、find . -name '*data*txt'と書くことで取り除くことができます。 find | grepパイプラインの出力におけるすべての単語については

for file in $(find -name '*txt' | grep data) 

、名前fileにその単語を割り当て、ループを実行します。見つかった名前の中に空白やグロブ文字が含まれていると、これは分解することができます。これを処理するには、findのネイティブ-execフラグを使用する方が良いでしょう。

echo $file >> $outputFile 

$outputFileを拡大したパスで、新規または既存のファイルへの変数「ファイル」の拡張を追加します。前者の拡張がダッシュで始まっている場合、echoはそれを引数として扱う可能性があります。後者の展開に空白またはグロブ文字が含まれていると、 "あいまいなリダイレクト"エラーが発生する可能性があります。展開を引用すると良いでしょう。printfを使用して、printf '%s\n' "$file" >> "$outputFile"のように、引数の大文字小文字をechoにしないようにしてください。

cat $file >> $outputFile 

$outputFileを展開したパスに、変数「ファイル」の展開で見つかったファイルの内容を追加、または別のあいまいなリダイレクトエラーを引き起こします。 cat "$file" >> "$outputFile"のような拡張を引用する方が良いでしょう。前述の拡張エッジ例どれもが予想しなかった、このように、この全体のスクリプトを記述する方が良いだろうと仮定すると

:それだけでファイルを兼ね備えよう

find . -name '*data*txt' -print -exec cat {} \; >> "$1" 
+0

+ 1. 'find'コマンドは私にとって丈夫です。あなたがそれがうまくいかないことを期待していたいくつかのケースはありましたか? – John1024

+0

@ John1024元の 'find |その名前に改行を含むファイルがあると、grepコマンドが失敗する可能性があります。 – kojiro

+0

私は明確にしましょう:このコマンド 'find。 -name '* data * txt' -print -exec cat {} \; >> "$ 1"は私には丈夫なように見えますが、それは前述の拡張エッジケースのどれも期待されていなかったと仮定して_ "というフレーズで導入されています。私は、そのようなエッジケースがそのコマンドのためにあったのだろうかと思っていましたか? – John1024

関連する問題