if文による条件分岐
次のシェルスクリプトをsample2.shとして作成します。
#!/bin/bash if test -f sample1.sh then source sample1.sh else echo "sample1.shがありません" fi
sample1.shと同様に実行権限を付与してから、実行してみましょう。
# ./sample2.sh TEST TEST2
sample2.shを実行したのに、sample1.shを実行したのと同じ内容が出力されていますね。この結果はいったん置いておいて、次にsample1.shのファイル名を次のように変更してから、sample2.shを再度実行してみます。
# mv sample1.sh sample1.sh.bk # ./sample2.sh sample1.shがありません
実行結果が変わりましたね。これはどういうことでしょうか?
sample2.shの内容を詳しく見ていきましょう。各行の意味は次のとおりです。4行目に出てくるsource
コマンドは、引数で受け取ったファイルを実行します(コラムを参照)。
1行目:#!/bin/bash
(bashを使う宣言。上述のとおりです)
2行目:if test -f sample1.sh
(sample1.shというファイルがもし(if)あれば)
3行目:then
(その場合は)
4行目:source sample1.sh
(sample1.shを実行し、)
5行目:else
(それ以外の場合は)
6行目:echo "sample1.shがありません"
(”sample1.shがありません” と表示する)
7行目:fi
(if
文の終了)
最初に実行したときは「sample1.sh」が存在したので4行目が実行され、 2度目に実行したときは「sample1.sh」が存在しなかったので6行目が実行されたということです。
シェルスクリプトは、このようにある条件によって処理を分岐する条件分岐処理を、 if~then...else...fi
という構文で記述できます。else...
は省略可能で、その場合は「もし~だったら…する」という意味になります。
「source」コマンドについて
source
コマンドは、引数に指定されたファイルを実行するコマンドです。source
は.
(ドット)で書き換えることができるため、sample2.shの4行目は次のようにも書けます。
. sample1.sh
分かりづらいですが.
とsample1.sh
の間にスペースがある点に注意しましょう。スペースがないと意味をなさなくなってしまいます。また、相対パスの.
とは意味が違うということも押さえておきましょう。
条件判定部分の書き換え
if
文の条件のtest -f sample1.sh
という記述は、次のように書き換えられます。
if [ -f sample1.sh ]
こちらも分かりづらいですが、[
と]
の前後にはスペースが必要な点に注意しましょう。
さまざまな条件分岐
さて、-f sample1.sh
の部分ですが、これは「ファイルsample1.shがあるか」を判定するものでした。シェルスクリプトではファイルの有無以外にも、さまざまなものを対象に条件分岐を行えます。例えば、次のような条件分岐もできます[1]。
-
-d directoryA
……「directoryA」があるか -
${VAL1} -eq ${VAL2}
…… 変数VAL1
とVAL2
の値が等しい(equal)か -
${VAL1} -ne ${VAL2}
…… 変数VAL1
とVAL2
の値が等しくない(not equal)か
また、この条件を満たすとき(「trueのとき」「真のとき」といいます)、このコマンドの実行結果は「0」になり、 条件を満たさないとき(「falseのとき」「偽のとき」といいます)、このコマンドの実行結果は「1」になります。実行結果は$?
記号で取得できるので、次のシェルスクリプトでは「1」が3回表示されます。
#!/bin/bash test -d directoryA; echo $?; VAL1=10; VAL2=20; [ ${VAL1} -eq ${VAL2} ]; echo $?; STR1=aaa STR2=aaa [ ${STR1} != ${STR2} ]; echo $?
# ./sample3.sh 1 1 1
この条件の指定方法によって、様々な条件で分岐処理を行うシェルスクリプトを、組めるようになります。シェルスクリプトの便利さが見えてきましたね。
注
[1]: 文字列をチェックする場合には-eq
の代わりに=
、-ne
の代わりに!=
を使います。
変数の使い方
シェルスクリプトでは任意の値を代入できる変数が使えます。変数に値を代入するときには変数=値
と記述します。イコール記号の前後にスペースが入っていると、代入ではなく「等しい」の意味になってしまうので注意しましょう。
また、変数の値を参照するときには、$変数
または${変数}
と記述します。右辺や条件式に登場するときには、この記述であることが多いです。