📝

Bash入門

2021/11/19に公開

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.00.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

ちゃんと学びたい方へ

下記のサイトをお勧めします。

https://www.tohoho-web.com/ex/shell.html

Discussion