[ 岡山大学 | 理学部 | 地球科学科 | 地球および惑星大気科学研究室 ]

大気科学演習1

シェルスクリプト

変数

計算機の世界で変数というのは「名前の付いた容れ物」である. 容れ物には数字や文字を入れることができる. 容れ物に数字や文字を入れることを「代入する」と言う. 容れ物に入った数字や文字を見ることを「値を参照する」と言う.

変数に値を代入するときは,変数と値を「=」でつなぐ. 「=」の右が,左に代入される. 「=」の前後に空白を入れてはいけない.

変数の値を参照するときは,変数の先頭に「$」をつける.

例えば,以下のようなファイル(test01.sh)を作成する.

#!/bin/bash
word1=Hello
word2=World
echo $word1 $word2

2行目は,word1という名前の付いた容れ物にHelloという文字列を入れている. 3行目は,word2という名前の付いた容れ物にWorldという文字列を入れている. 4行目の echo は $word1 と $word2 を表示する.先頭に$が付いた文字列は,$に続く文字列(ここではword1とword2)の名前が付いた容れ物の中身を指す.すなわち,この例だと,$word1はword1という名前の付いた容れ物の中身なのでHello,$word2はword2という名前の付いた容れ物の中身なのでWorld,ということである.

実際に実行してみる. まず実行許可を出して,

$ chmod a+x test01.sh

実行する

$ ./test01.sh

正しく実行されれば以下のように表示されるはず.

Hello World

空白を含む文字列を代入するときは,クォーテーションで括る.

例えば

#!/bin/bash
phrase='Hello World'
echo $phrase

これを実行したら

Hello World

変数をつなげるときは,変数の切れ目がわかるように,変数を{}で括る.

例えば

#!/bin/bash
YEAR=2019
MONTH=10
DAY=24
echo ${YEAR}${MONTH}${DAY}

これを実行したら

20191024

間に文字を挟むこともできる.

例えば

#!/bin/bash
YEAR=2019
MONTH=10
DAY=24
echo ${YEAR}nen${MONTH}gatsu${DAY}nichi

これを実行したら

2019nen10gatsu24nichi

普通は間に挟む文字に nen とか gatsu とか使わないですかね.

#!/bin/bash
YEAR=2019
MONTH=10
DAY=24
echo ${YEAR}/${MONTH}/${DAY}

これを実行したら

2019/10/24

ちなみに,

#!/bin/bash
phrase='Hello World'
echo $phrase

を実行したら

Hello World

であるが,

#!/bin/bash
echo $phrase
phrase='Hello World'

は異なる結果になる. 理由はわかりますよね.

コマンド置換

「$(」と「)」で囲まれた部分は,コマンドとして処理される(ただし末尾の改行は削除される).

#!/bin/bash
files=$(ls)
echo $files

実行してみる. 結果を

$ ls

と比べてみる.

ファイルの数を変数に格納するなら

#!/bin/bash
filenum=$(ls | wc -l)
echo $filenum

実行してみる. 結果を

$ ls | wc -l

と比べてみる.

算術演算(整数)

整数の四則演算は,算術式を $(( と )) で囲む.

二重括弧の中は,変数に $ をつけなくてもよい. すなわち,$(( x + y )) と書いたら,変数xと変数yの和が計算される. もちろん $(( $x + $y )) と書いてもよい.

二重括弧を使った四則演算は,小数を使うことができない. 除算の戻り値は整数(小数点以下切り捨て)になる.

算術演算(小数)

echo コマンドで表示した式をパイプで bc コマンドに流し込む.

echo "9 + 0.123" | bc

変数を使うときも同様.

echo "$x + $y" | bc

割り算は小数点以下を切り捨てる.

echo "100/3" | bc

割り算で小数点以下を表示したいときは,scaleで小数点以下の桁数を指定する.

echo "scale=4; 100/3" | bc

結果を変数に代入する場合.

z=$( echo "$x + $y" | bc )

算術比較

数値を比較して,真か偽かを返す.

反復構造(while)

条件が満足されている間,do と done の間を繰り返す.

#!/bin/bash
i=0
while [ $i -lt 3 ]; do
  i=$(( i + 1 ))
  echo $i
done

書いたら実行してみる

1
2
3

ここで,

i=$(( i + 1 ))

というのが出てきて,i と i+1 が = で結ばれているのを見ると,なんか気持ち悪いと思うかもしれない. シェルスクリプトの世界において「=」は,右のものを左のものに代入する,という意味である. したがって,この行は i+1 を i に代入しろ,という意味であり,言い換えると,i の数値を 1 増やせ,ということである.

強制終了

上のスクリプトで,i=$(( i + 1 )) を書き忘れたとする

#!/bin/bash
i=0
while [ $i -lt 3 ]; do
  echo $i
done

これを実行すると,

0
0
0
0
0
...

となって,いつまで経っても終わらない. このスクリプトでは,最初に i=0 とした後,変数 i の値が変更されることがないため,while [ $i -lt 3 ]; do の条件が常に真となって,echo $i が繰り返し実行される.

これを止めるには,外から強制終了するしかない. 強制終了は

Ctrl + c

とする. 少し待つかもしれないが,スクリプトが終了してプロンプトが表示される.

反復構造(while)続き

入れ子にすることもできる.

#!/bin/bash
i=0
while [ $i -lt 2 ]; do
  i=$(( i + 1 ))
  j=0
  while [ $j -lt 3 ]; do
    j=$(( j + 1 ))
    echo $i $j
  done
done

実行したら

1 1
1 2
1 3
2 1
2 2
2 3

反復構造(for)

与えられた値を代わりばんこに代入して,do と done の間を繰り返す.

#!/bin/bash
for word in apple banana cherry; do
  echo I like $word
done

実行

I like apple
I like banana
I like cherry

こっちも入れ子にすることができる.

#!/bin/bash
for dare in I You ; do
  for fruit in apple banana cherry ; do
    echo $dare like $fruit
  done
done

実行

I like apple
I like banana
I like cherry
You like apple
You like banana
You like cherry

数字も使える

#!/bin/bash
for i in 1 2 3 4 ; do
  echo $i
done

実行

1
2
3
4

seq というコマンドが使えるときは,1 2 3 4 と書く代わりに以下のようにしてもよい

#!/bin/bash
for i in $( seq 1 4 ) ; do
  echo $i
done

seq は数列を出力するコマンドである. 使い方は

$ man seq

で確認することができる.

man はコマンドの使い方を説明してくれるコマンド. スペースキーでページ送り,終了するときは「q」.




Last Updated: 2022/11/12, Since: 2019/10/24.
This page is generated by Makefile.rd2html.