シェルはたまにしか使わないので、すぐ忘れてしまう。ので、ここにメモすることにする。[Unix|Linux]コマンドの使い方は[[linux_command]]へ. ====== スクリプトを保存する時,自動的に chmod +x を行う ====== .emacs に以下を記述するとファイルの先頭に#!が含まれているとき、自動的に chmod +x を行ってくれる。 (add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p) ====== シェルからgnuplotで図を作成(epsやpsなどにする) ===== たくさん図を作るときなどに。 make && ./a.out gnuplot < ====== シェルからgnuplotで図を作成(Xで表示) ===== =====決定版?===== 次のようにやると、./do.shとやると数値解と解析解を比べてくれる。 #do.shの中身 #!/bin/sh make && ./a.out gnuplot -persist < =====↑に到達するまでのやりとり===== 以下のdo.shとplot.gpを用意すると、./do.shとやるだけで、数値解と解析解を比べてくれる。 #do.shの中身 make && ./a.out ./plot.gp #plot.gpの中身 #!/thin/local/bin/gnuplot -persist plot 'suuchikai.dat','kaisekikai.dat' -persistとやると、Xの画面が勝手に消えなくなる。 #!/thin/local/bin/gnuplotの部分は各自のgnuplotが置いてある場所を指定すること。 which gnuplot とやって出てきたものを書き込めばよろしい。 バグ取り時に大活躍(のはず)。 ただし、スクリプトが二つのファイルになってしまう。 もっとsmartなやり方があるのかもしれない。FIXME gnuplotのパスに依存しないやり方はこんな感じかしら. #!/bin/sh make && ./a.out gnuplot -persist plot.gp ====== readする値をshellで食わす ===== * fortranなんかのread文に値を食わせるときに使うshell. * ファイルを作ってリダイレクトするのが面倒なときに. * 変数1つの場合 echo 5 | ./a.out * 変数が2つ以上 echo "5\n6" | ./a.out あるいは ./a.out << EOF 5 6 EOF ====== 文字を置換する(sed) ====== inputの中のすべてのappleをorangeに置換して、outputに放り込む。 sed -e 's/apple/orange/g' input > output ====== シェルで実数計算 ====== bcと、scaleを使う。scaleには欲しい桁数を入力する。 `は'ではないので注意が必要. sq3=`echo "scale=17; sqrt(3)" |bc` a=`echo "scale=17; $sq3/10.0" |bc` bcについて補足. -lオプションで20桁まで計算+関数の使用が可能になる. echo "e(1)" | bc -l e(x)はexp(1)のこと. ====== ファイルから何かを読み取って変数に代入 ====== hoge.datが一行からなる情報を持っているとき。 a=`cat hoge.dat` 複数行からなるpiyo.datから一行ごとに読み取りたければreadを使う。 cat piyo.dat | while read i do a=`echo $i` (aを使ってなにか作業) done ====== data file から必要な列だけを取り出す ====== awkを使う。n列目とm列目が欲しいなら、 awk '{print $n,$m}' hoge.dat ====== 0.1刻みで変数iを増加させながら何か実行 ====== do i=1,100 di=1.d-1*dble(i) write(*,*) di 何か作業 enddo のようなことをやりたければ、 i=1 while [ `echo "$i <= 10" |bc` -eq 1 ] do echo $i 何かコマンド i=`echo "$i + 0.1" |bc` done とすればよい。 ====== 1刻みで変数aを増加させながら何か実行 ====== aを0から99まで動かすとき、 a=0 while test $a -ne 100 do echo $a  何か実行 a=`expr $a + 1` done ====== 変数を適当に変えてケーススタディー ====== 周波数omegaを適当に振って計算した例。 make for omega in 3.125 3.135 3.145 3.155 6.265 6.275 6.285 6.295 do rm -fr output_linc_beta0_w${omega} echo ${omega} | ./a.out cp -r output output_linc_beta0_w${omega} done ====== 変数を端末から読み込みたい ====== readを使う。 echo "what's your name" read name echo your name is $name. ====== 3分待ってからプログラムを実行 ====== sleepを使う。 sleep 180 && ./a.out