シェルはたまにしか使わないので、すぐ忘れてしまう。ので、ここにメモすることにする。[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