bashはプログラミング言語と同じように値による条件分岐や、繰り替え一処理を行うことができる。これを制御構造と呼ぶ。
複合コマンド
シェルスクリプトで制御構造を利用するためには、複合コマンドを利用する、よく使われるのは「if」「for 」「case」「while」の四つの複合コマンド。
if文
if文は条件を評価して、その真偽に応じて処理を分岐するための機能を持つ。
#!/bin/bash
# []の前後にスペースを入れないけれならない
## ["$1" = "hello"]; と書くとエラーになるので注意が必要
# 条件式の後には「;」を入れなければならない、入れないのであれば改行する必要がある
## ["$1" = "hello"] と書くとエラーになるので注意が必要
if[ "$1" = "hello" ]; then
echo "OK"
else
echo "NG"
fi
# ※ testコマンドと[]
# [] はコマンドであり条件を引数としてとるコマンド。
# testコマンドは[]と同じ動きをするコマンド
# 下記は等価
if [ "$1" = "hello" ]; then
if test "$1" = "hello"; then
条件に利用される文字列の比較
= | 左辺と右辺が等しいか |
---|---|
!= | 左辺と右辺が等しくないか |
-n | 与えられる引数が空文字でないかどうか |
-z | 与えられる引数がから文字であるか |
条件に利用される数字の比較
-eq | 左辺と右辺が等しい |
---|---|
-ne | 左辺と右辺が等しくない |
-lt | 左辺が右辺より小さい |
-le | 左辺が右辺以下 |
-gt | 左辺が右辺より大きい |
-ge | 左辺が右辺以上 |
条件を結合するための演算子
条件式1 -a 条件式2 | 条件式が両方真の場合真 |
---|---|
条件式1 -o 条件式2 | 条件式のどちらかが真の場合真 |
! 条件 | 条件の反転 |
() | 条件のグループ化 |
for文
スペースや、タブで区切られた単語に対して繰り返し処理を行う構文。
# for.sh
for str in aaa bbb ccc
do
echo $name
done
./for.sh
=> aaa
=> bbb
=> ccc
# 下記で引数を区切って渡しても良い
for name in $@ # (for name in $* でも良い)
do
echo $str
done
./for.sh aaa bbb ccc
=> aaa
=> bbb
=> ccc
case文
指定された文字列がパターンにマッチするかどうかを判断し、マッチしたパターンに対応する処理を行うための制御構文。
case "$1" in
*.txt)
echo "$1 is txt"
;;
*.sh)
echo "$1 is sh"
;;
*)
echo "not eq"
;;
esac
while文
指定した条件が真である場合、do ~ doneの間の処理を繰り返す制御構文。
# while.sh
i=1
while [ $1 -le 10 ]
do
echo $i
i=$((i + 2)) # $(()) という書き方は「算術式展開」という
done
./while.sh
=> 1
=> 3
=> 5
=> 7
=> 9