Bash入門
Bashを書こうとする人が初めてプログラミングを学ぶ人ということはまず無いと思うので、詳細な説明は省略します。実行時はbash ファイル名.sh
のようにして実行します。初めてだとbashとファイル名の間に空白を入れ忘れる方が多いので気を付けてください。
Hello World!
#!/bin/bash
echo "Hello World!"
Hello World!
変数
変数を宣言するとき=
の前後に空白は入れません
#!/bin/bash
a="Hello World!"
echo $a
Hello World!
配列
インデックスは0からです.
#!/bin/bash
A=("H" "He" "Li" "Be" "B" "C" "N" "O" "F" "Ne")
echo ${A[2]}
Li
For文(外延)
#!/bin/bash
for atom in "H" "He" "Li" "Be"; do
echo $atom
done
H
He
Li
Be
For文(内包)
#!/bin/bash
for ((i=1; i<6; i++)); do
echo $i
done
1
2
3
4
5
For文&計算
echo "$i*0.2"
の結果をパイプしてbc
コマンドに渡します. カウンタ変数$i
に0.2をかけた結果が$x
に格納されます.
#!/bin/bash
for ((i=0; i<10; i++)); do
x=$(echo "$i*0.2" | bc)
echo $x
done
0
.2
.4
.6
.8
1.0
1.2
1.4
1.6
1.8
しかし, 0.0
や0.2
が.0
や.2
のようになってしまいますので, さらにxargs printf %.1f
にパイプして渡すと
#!/bin/bash
for ((i=0; i<10; i++)); do
x=$(echo "$i*0.2" | bc | xargs printf %.1f)
echo $x
done
0.0
0.2
0.4
0.6
0.8
1.0
1.2
1.4
1.6
1.8
のようにできます. printf
の書式についてはこちらを参考にしてください.
For文&配列
#!/bin/bash
A=("H" "He" "Li" "Be" "B" "C" "N" "O" "F" "Ne")
for i in "${!A[@]}"; do
echo $i ${A[i]}
done
0 H
1 He
2 Li
3 Be
4 B
5 C
6 N
7 O
8 F
9 Ne
For文でファイル操作
例えば, .out
という拡張子のファイルに対して以下のようにします. ここではファイル名をechoするだけですが, 書き換えれば色々と便利に使えます.
for file in *.out; do
echo $file
do
複数種類の拡張子を扱う場合は, 空白を開けてワイルドカードを使うだけです.
for file in *.f *f90; do
echo $file
done
関数
#!/bin/bash
function test () {
echo "x,y,z
$1,$2,$3
$1,$2,$3
$1,$2,$3"
}
test 9 8 7
x,y,z
9,8,7
9,8,7
9,8,7
上記のように宣言, 引数を渡します. test
の後の()は何なのかよくわからない. ()の中に引数を渡すわけじゃないのか?と疑問に感じるのが普通な気がしますが... 戻り値も与えることができます .
応用例
パラメータを変えた入力ファイルを大量に作りたい時に使う例。Gaussianで水素分子の一点計算を行う入力ファイルを二重ループで3×3パターン生成する。
#!/bin/bash
for method in "HF" "CID" "CISD"; do
for basis in "STO-3G" "3-21G" "4-31G"; do
echo "# ${method}/$basis Units=AU
H2
0 1
H 0.0 0.0 0.0
H 0.0 0.0 1.4
" > "H2_${method}_${basis}.gjf"
done
done
出力としては9個のGaussianのインプットファイルが生成されます。これはGaussianの例ですが、Hartree-Fock極限とか相関エネルギーを可視化するときに使えると思います。PECを描きたい場合は下記のようなスクリプトが使えます.
#!/bin/bash
for ((i=10; i<51; i++)); do
R=$(echo "$i*0.1" | bc | xargs printf %.1f)
echo "# HF/STO-3G Units=AU
H2
0 1
H 0.0 0.0 0.0
H 0.0 0.0 $R
" > "R=${R}.gjf"
done
ちゃんと学びたい方へ
下記のサイトをお勧めします。
Discussion