• ベストアンサー

シェルスクリプト 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に書かれている行分ループ。 という形のシェルスクリプトを作成したいと思っています。 上手く説明できないのですが、このようなことが出来るのかお教えいただけますでしょうか。 出来るのであれば、どのようにすればできるのかご教授いただけると幸いです。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4844/10253)
回答No.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 の場合に結果が違ってきます。

tamanegin
質問者

お礼

丁寧なご説明ありがとうございました! すごくよくわかりました。 今回は改行で記述したいと思っておりましたので、 whileでやりたいと思います。 あと、パスについてはフルパスで記載するつもりでしたので、 cdを外側にしてやります。 すごく助かりました!

その他の回答 (2)

  • pakuti
  • ベストアンサー率50% (317/631)
回答No.2

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 でも、良いと思いますが

tamanegin
質問者

補足

ありがとうございます! どちらでもやりたいことが実行できたのですが、 whileではなく、forを使用しますとのことですが、 何かパフォーマンス的なことなのか、forを使うことのほうが 何かメリットがあるのでしょうか。 何度も質問という形になってしまい、申し訳ないのですが、 宜しくお願い致します。

  • notnot
  • ベストアンサー率47% (4844/10253)
回答No.1

while read dirname do while read filename do (cd $dirname; svn up $filename) done < $2 done < $1 ですかね。

tamanegin
質問者

補足

ありがとうございます! 上手くできたのですが、もう一つだけ質問があるのですが・・・ 上記のようなシェルを作成し、実行したら、 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 というように実行されるようにはできないでしょうか。 お手数ですが、ご教授いただけますでしょうか。 宜しくお願い致します。

関連するQ&A

  • シェルスクリプトに関する質問です

    シェルスクリプトに関する質問です 以下のようなシェルスクリプトを書きたいのですが,難しくて出来無いのでどなたか ご協力お願いします。 foldaという名前のフォルダの中に1~100のフォルダがある. それら100個のフォルダの中に,それぞれfile.txtというテキストファイルがあり,これには 112.73 のように小数点ありの数字が1行書かれている. このfile.txtの内容を全て読み取って,それら100個分のデータを 1つのファイルに出力するスクリプト スクリプトファイルはfoldaの中にあるものとする. よろしくお願いします.

  • シェルスクリプトの引数について

    test.sh '*.c' といったコマンドを入力した時に、 シェルスクリプト内で引数$1を受け取ったときに$1='*.c'となるのではなく、 カレントディレクトリ内にある'*.c'の正規表現にマッチするファイルが入ってしまっています。 例)カレントディレクト内にaaa.cファイルbbb.cファイルといったファイルがある時は、 $1=aaa.c bbb.cとなっています。 '*.c'の正規表現自体をシェルスクリプト内で受け取る方法はないのでしょうか? シェルはbashを使用しています。

  • シェルスクリプトの引数

    シェルスクリプトの引数 linuxのシェルスクリプトの引数に関しての質問です。引数の数が一桁くらいならいいのですが、200万個の引数を使うとなると、いちいち引数を手で書くわけにはいきません。引数をテキストから直接読み込むことはできませんか?

  • シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。

    シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。 ファイル名を変更するシェルスクリプトをbashで行おうとプログラムを作成したのですが、 実行するとbad interpreter: ディレクトリではありません とメッセージが出て終了します。記述に誤りがあるのか、実行の仕方が悪いのか分かりません。教えて下さい。 シェルの記述内容は ファイル名をtest.sh #!/bin/bash/ -f mv A.txt A.ori exit 実行方法として #>chmod x+a test.sh #>./test.sh で行いました。そうしたら、bad interpreter: ディレクトリーではありません とメッセージが出ます。 ちなみに #>. test.sh で実行するとターミナルがシェルの実行と同時に閉じてしまいますが、シェルを実行したディレクトリーを確認すると、処理が終わっておりました。

  • 簡単なシェルスクリプトを見てください。

    次のようなシェルスクリプトを作成しました。 #!/bin/sh echo [$1] awk '/"0312345678"/ {print}' /test > /test1 awk '/$1/ {print}' /test > /test2 のように簡単なスクリプトです。 $ sample \"0312345678\" で実行させたら、echo では"0312345678"に出力されます。 しかし、test1にはちゃんと結果が入っていますが、test2は空のファイルです。 なぜ、結果が違うのですか? 実行時、引数を渡す方法で、test1と同じ結果を得たければ、どうすればいいのですか?

  • 【初心者】シェルスクリプトの引数に関して

    現在、シェルスクリプトを作成しようと奮闘中です。 そこで引数に関してお伺いさせてください。 以下が実施したい内容になります。 (1)./test.sh ⇒引数を指定していないため、「引数を指定してください。」と出力し処理終了 (2)./test.sh daily⇒引数で指定した[daily]の処理を実行 (3)./test.sh weekly⇒引数で指定した[weekly]の処理を実行 (1)~(3)の条件を含んだシェルスクリプトを作成するには、 どのような実行処理が必要かご教授お願いします。 ※処理内容に関しては特に指定はございません。 例: daily=特定ディレクトリのコピー weekly=dailyで処理したディレクトリをtarで圧縮し別のディレクトリへ移動 など分かりやすい内容だと幸いです。 また、情報に不備などがありましたらご指摘おねがいします。

  • シェルスクリプトで

    いくつかのテキストファイルがあって, その中で内容が重複するもの(ファイル名は違うが中身は同じ)ファイルをみつけるシェルスクリプトが書きたいのですが, どのように書けばよいでしょうか. というかそのように書くことは可能でしょうか. ぶしつけですいませんが,回答お願いいたします.

  • シェルスクリプトについて。

    Bシェルを使って、下記の処理をしたいと思っているのですが 何をやっても上手くいきません;; 分かる方、是非アドバイスいただきたいです! WEBからawk,while等を調べて自分なりにつくってみましたが 文字列の抽出もできない状態です。 ------------------------------ テキスト内容(例) 氏名[タブ]住所[タブ]電話番号 ------------------------------- 上記のような、テキストから住所だけ、指名と住所だけ等の パターンで抜いて、別のシェルの引数として渡すといった処理が したいです。 別のシェルというのは、引数に与えられた内容を、別のファイルに 書き出すという仕組みですが、よくわかりません。 今までいっぱい行がある中から、ひとつひとつ手作業で引数に渡し てたのを、自動でやりたいです。 日本語がおかしい所があると思いますが、宜しくお願いします。

  • UNIX シェルスクリプト

    UNIXのシェルスクリプトを使用してテキストファイルのある列にある 特定の文字列を条件としてその行を出力するということをやりたいのですが どのようにすればできるでしょうか? 例えば,以下のようなテキストファイルがあって,2列目がYAHOOの行を 主力したいというようなことです。 AAA SOFTBANK BBB YAHOO YAHOO TEST CCC QUICK DDD YAHOO ↓ BBB YAHOO DDD YAHOO

  • シェルスクリプトの内容について

    業務で使用しているシェルスクリプトの中身に find A/B/ -name File1 -exec mv {}/C/D \; ※AとBとCとDはディレクトリ名、File1はファイル名   という記述があってfindによる検索結果をmvの引数に持ってきて C/D/の直下にFile1を移動している意味はわかったのですが最後尾にある「¥」の意味がよくわかりません。 よろしくお願いします。