シェルはたまにしか使わないので、すぐ忘れてしまう。ので、ここにメモすることにする。[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 <<EOF
set term post eps
set out "hoge.eps"
plot 'fort.88'
EOF

シェルからgnuplotで図を作成(Xで表示)

決定版?

次のようにやると、./do.shとやると数値解と解析解を比べてくれる。

#do.shの中身
#!/bin/sh
make && ./a.out
gnuplot -persist <<EOF
plot 'suuchikai.dat','kaisekikai.dat'
EOF

↑に到達するまでのやりとり

以下の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
shell_script.txt · 最終更新: 2011/08/24 22:41 by isakari
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0