計算機の世界で変数というのは「名前の付いた容れ物」である. 容れ物には数字や文字を入れることができる. 容れ物に数字や文字を入れることを「代入する」と言う. 容れ物に入った数字や文字を見ることを「値を参照する」と言う.
変数に値を代入するときは,変数と値を「=」でつなぐ. 「=」の右が,左に代入される. 「=」の前後に空白を入れてはいけない.
変数の値を参照するときは,変数の先頭に「$」をつける.
例えば,以下のようなファイル(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 word1=Hello word2=World echo $word1 $word2
これは,2行目でword1という容れ物にHelloという文字列を入れ,3行目でword2という容れ物にWorldという文字列を入れて,4行目でword1とword2という容れ物に入った値を表示する. というのは,すでに説明済み. ここで,3行目を以下のように書き換えてみる
#!/bin/bash word1=Hello word2=word1 echo $word1 $word2
どうなるか考える. 実際にやってみると以下のようになる.
Hello word1
ちょっと書き換えて
#!/bin/bash word1=Hello word2=$word1 echo $word1 $word2
こんどは
Hello Hello
どうしてこうなったか,わかりますよね?
「$(」と「)」で囲まれた部分は,コマンドとして処理される(ただし末尾の改行は削除される).
#!/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 )
数値を比較して,真か偽かを返す.
条件が満足されている間,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
とする. 少し待つかもしれないが,スクリプトが終了してプロンプトが表示される.
入れ子にすることもできる.
#!/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
与えられた値を代わりばんこに代入して,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」.