• 締切済み

シェル ファイルの中身によって特定の処理

シェルスクリプトに関する質問です。 少しシェルで言語風なものを作ってみようと思い、作成したのですが、上手くいかないので質問させて頂きました。内容は、特定の文字がファイルに記載されているか判定して、 特定の文字だったら処理をするというものです。 現在、このようなソースになっています↓ #!/bin/sh - #ファイルを設定(仮) file_name="dummy.sh" #行数を変数へ格納 line=$(wc -l ${file_name}) #行数をlog.txtへ書き込む echo ${line} > log.txt #行数以外にファイル名があるので削除 sed -i "s/$file_name//g" log.txt #行数を格納 Line=$(cat log.txt) i=0 #全ての行を変数へ格納 #ここが問題 配列に変数が使えない!? while [ $i = ${Line} ] do array[$i]=$(sed -n "${i}p" ${file_name}) expr `${i} + 1` done # 格納した変数をチェックして、 # 指定された文字(hello)が書かれていればhelloと表示させる b=0 while [ $b = ${main_file} ] do if [ array[$b] = "hello" ] then echo "hello" fi expr `$b + 1` done ここで、配列を利用し、変数への代入が出来ませんでした。 ただ、エラーは表示されません。。。 環境はUbuntu10.10です。 何もいじっていないので、たぶん大丈夫だと思うんですが・・・ 何か解決策はありませんか? また、コレよりいい方法などがあればぜひ教えてください。

みんなの回答

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.4

まあ、目的を達するための最短ということだと、他の方が書いてる通り、grep 一発ですが、 シェルスクリプトの練習という意味で、できるだけ元のスクリプトを生かすと、こんなかんじ。 2回目のループでは、whileでなくforを使ってみました。sedの行番号が1から始まるので、添え字も1からにしました。 #!/bin/sh - #ファイルを設定(仮) file_name="dummy.sh" #行数を変数へ格納 #行数を格納 Line=$(wc -l < ${file_name}) #全ての行を変数へ格納 array=() i=1 while [ $i -le ${Line} ] do array[$i]=$(sed -n "${i}p" ${file_name}) i=`expr ${i} + 1` # ↑これは let i++ でもいい done # 格納した変数をチェックして、 # 指定された文字(hello)が書かれていればhelloと表示させる for((b=1; b < Line; b++)) do if [ "${array[$b]}" = "hello" ] then echo "hello" fi done ↑だと、「hello とだけ書かれた行があったときに」ですが、「行の中にhelloが含まれていれば」ならば、 for((b=1; b < Line; b++)) do case "${array[$b]}" in *hello*) echo "hello" ;; esac done

回答No.3

>何か解決策はありませんか? 普通にgrepを使ったら? シェルは行に分解しての処理に向いてないですよ。 #!/bin/sh file_name="a.txt" grep hello $file_name > /dev/null if [ $? -eq 0 ] then echo hello fi

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.2

>>また、コレよりいい方法などがあればぜひ教えてください。 シェルスクリプトを作ったこともありますが、質問にあるBシェルは、個人的にはなかなか作るのが難しい言語だと思っています。 Cシェルで作ると、C言語っぽい文法なので、まだなじみ易いですよ。 また、質問のようなテキストを読んだり、ファイル名を拾ったりするような、ちょっと凝った処理は、シェルで書くよりも、PerlとかRubyなどのいわゆるスクリプト言語で書くほうがずっと楽です。ネットで探すのもいいですが、書店にいけば、CD-ROM付きのPerlやRubyの書籍がありますので、それらの中から適切なものを購入されればいいと思います。

  • sholmes
  • ベストアンサー率81% (89/109)
回答No.1

bashの配列はあまり使ったことが無いこともあり、自分も細かい部分がわかりません。 それ以外の大きな部分で気になる箇所が見受けられたので、幾つか列記させて下さい。 もし一時ファイルが必要ならば、ファイル名にプロセス番号等含めるようにしましょう。 ただ、今回のように行数を変数に入れるだけの作業であれば、ファイルで書き出すまでの必要もありません。 line_count=`wc -l "$file_name" | cut -f1 -d' '` 全ての行を逐次走査するときに、(シェルスクリプトに限らず)予め行数を把握しておく必要はありません 今回の内容ならば、whileでread を回すやり方で良いと思います。 ちなみに、「helloが含まれていたらhelloを表示する」という意味だけで言えば、この一行でも今回の全体要件を満たせます。 grep -q 'hello' "$file_name" && echo 'hello' 他にも色々と疑問点をお持ちだとは思うのですが、今回のスクリプトを書く際になんらかのWebサイトを参考にされましたでしょうか? サイトのURIを教えて頂ければ、先にそちらを見てみたいと思います。

関連するQ&A