- ベストアンサー
シェルスクリプト while read lineにつきまして
シェルスクリプトについて、各行の値を使って、更新したいと考えています。 引数を2つ持たせて、2つともファイルです。 ファイル名1には、 test1 test2 test3 のディレクトリを記載し、 ファイル名2には、 test4.txt test5.txt test6.txt のテキストを記載します。 例) 引数1 ファイル名1 引数2 ファイル名2 while read lineをどのように使ったら良いかわからないのですが、 ファイル名1を1行ずつ読み込んで、 読み込んだディレクトリをファイル名2に書かれているテキストを更新します。 具体的にやりたいと思っている内容ですが、 ・cd ファイル名1の1行目ディレクトリ ・svn up ファイル名2のテキスト ここをファイル名2に書かれている行分ループして 上記svn upコマンドを実行します。 ・ファイル名2に書かれている行分ループ完了後、 ファイル名1の2行目にかかれているディレクトリを読み込んで、 cd ファイル名1の2行目ディレクトリ ・svn up ファイル名2のテキスト ここをファイル名2に書かれている行分ループ。 という形のシェルスクリプトを作成したいと思っています。 上手く説明できないのですが、このようなことが出来るのかお教えいただけますでしょうか。 出来るのであれば、どのようにすればできるのかご教授いただけると幸いです。 宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 cd を内側のループの外に出した場合、$2 のファイルの指定が相対バスだった場合、ファイルが見つからないと言うことになってしまいます。また、ファイル1に書かれているディレクトリ名が相対パスの場合も同じです。 それを避けるため、内側にし、かつ括弧で囲いました。 $2を必ずフルパスで指定し、ファイル1に含まれているディレクトリ名もすべてフルパスであるならcdを外側に移しても問題ありません。 また、 while read aa do ::::: done < file と for aa in `cat file` do ::::: done の違いは、前者がファイルの行単位で処理をするのに対して、後者は行に空白・タブが含まれた場合、それらで区切られた単語単位で処理をするという事です。 例えば、fileの中身が abc def ghi jkl の場合に結果が違ってきます。
その他の回答 (2)
- pakuti
- ベストアンサー率50% (317/631)
while ~では無いのですが、私ならこうします。 for dir in `cat $1`;do cd $dir for svn in `cat $2`;do svn up $svn done done もちろん while read dirname do cd $dirname while read filename do svn up $filename done < $2 done < $1 でも、良いと思いますが
補足
ありがとうございます! どちらでもやりたいことが実行できたのですが、 whileではなく、forを使用しますとのことですが、 何かパフォーマンス的なことなのか、forを使うことのほうが 何かメリットがあるのでしょうか。 何度も質問という形になってしまい、申し訳ないのですが、 宜しくお願い致します。
- notnot
- ベストアンサー率47% (4900/10357)
while read dirname do while read filename do (cd $dirname; svn up $filename) done < $2 done < $1 ですかね。
補足
ありがとうございます! 上手くできたのですが、もう一つだけ質問があるのですが・・・ 上記のようなシェルを作成し、実行したら、 cd test1 svn up test4.txt cd test1 svn up test5.txt cd test1 svn up test6.txt cd test2 svn up test4.txt cd test2 svn up test5.txt cd test2 svn up test6.txt cd test3 svn up test4.txt cd test3 svn up test5.txt cd test3 svn up test6.txt というようになるのですが、これでも問題はないのですが、 理想は cd test1 svn up test4.txt svn up test5.txt svn up test6.txt cd test2 svn up test4.txt svn up test5.txt svn up test6.txt cd test3 svn up test4.txt svn up test5.txt svn up test6.txt というように実行されるようにはできないでしょうか。 お手数ですが、ご教授いただけますでしょうか。 宜しくお願い致します。
お礼
丁寧なご説明ありがとうございました! すごくよくわかりました。 今回は改行で記述したいと思っておりましたので、 whileでやりたいと思います。 あと、パスについてはフルパスで記載するつもりでしたので、 cdを外側にしてやります。 すごく助かりました!