シェルスクリプトの制御構文について、文法と使い方を簡単にまとめてみました。
分岐処理の制御構文
if文
ある条件によって分岐したい場合に使用します。
「条件」が真の場合「処理」を実行します。
文法
if 条件 ; then
処理
fi
使い方
#!/bin/bash
# 引数の個数チェック
if [[ ${#} -ne 2 ]] ; then
echo 引数は2個必要です。
exit 1
fi
# 第1引数を「X」変数に代入
X=
# 第2引数を「Y」変数に代入
Y=
# 「X」変数値と「Y」変数値を比較(等しくなければ真)
if [[ ${X} != ${Y} ]] ; then
echo 等しくない
fi
「条件1」が真の場合「処理1」を実行します。「条件1」が偽の場合「処理2」を実行します。
文法
if 条件1 ; then
処理1
else
処理2
fi
使い方
#!/bin/bash
# 引数の個数チェック
if [[ ${#} -ne 2 ]] ; then
echo 引数は2個必要です。
exit 1
fi
# 第1引数を「X」変数に代入
X=
# 第2引数を「Y」変数に代入
Y=
# 「X」変数値と「Y」変数値を比較(等しくなければ真)
if [[ ${X} != ${Y} ]] ; then
echo 等しくない
else
echo 等しい
fi
「条件1」が真の場合「処理1」を実行します。「条件1」が偽の場合で「条件2」が真の場合「処理2」を実行します。「条件1」と「条件2」が偽の場合は、「処理3」を実行します。
文法
if 条件1 ; then
処理1
elif 条件2 ; then
処理2
else
処理3
fi
使い方
#!/bin/bash
# 引数の個数チェック
if [[ ${#} -ne 3 ]] ; then
echo 引数は3個必要です。
exit 1
fi
# 第1引数を「X」変数に代入
X=
# 第2引数を「Y」変数に代入
Y=
# 第3引数を「Z」変数に代入
Z=
# 「X」変数値と「Y」変数値を比較(等しくなければ真)
if [[ ${X} != ${Y} ]] ; then
echo 等しくない
# 「X」変数値と「Z」変数値を比較(等しくなければ真)
elif [[ ${X} != ${Z} ]] ; then
echo 等しくない
else
echo 等しい
fi
case文
値のパターンによって処理を振り分けたい場合に使用します。
case 値 in
パターン1)
処理1
;;
パターン2)
処理2
;;
パターン3 | パターン4)
処理3
;;
esac
使い方
#!/bin/bash
INPUT_DATA=
case ${INPUT_DATA} in
*.txt)
echo "text file"
;;
*.dat)
echo "data file"
;;
*.html | *.htm)
echo "html file"
;;
*)
echo "unknown file"
;;
esac
繰り返し(ループ)処理の制御構文
while文
ある条件が成り立つ間、ループ処理を実行したい場合に使用します。
文法
while 条件
do
処理
done
使い方-1
#!/bin/bash
# 条件が常に真であるため無限ループとなる
while true
do
date '+%Y/%m/%d %a %H:%M:%S'
sleep 1
done
使い方-2
#!/bin/bash
# 標準入力(キーボード)で入力されたものを表示する
while read INPUT_KEY
do
echo ${INPUT_KEY}
done
使い方-3
#!/bin/bash
# data.txt内の文字列を1行づつ読み込んだものを表示する
while read LINE
do
echo ${LINE}
done < data.txt
使い方-4
#!/bin/bash
# 「COUNT」変数の初期値
COUNT=1
# 条件が成り立つ間繰り返し
while [[ ${COUNT} -le 10 ]]
do
echo ${COUNT}
COUNT=$(( COUNT + 1 ))
done
until文
ある条件が成り立たない間、ループ処理を実行したい場合に使用します。
ほとんどの場合、while文で対応できるので、あまり使っていません。
文法
until 条件
do
処理
done
使い方-1
#!/bin/bash
# 条件が常に偽であるため無限ループとなる
while false
do
date '+%Y/%m/%d %a %H:%M:%S'
sleep 1
done
使い方-2(基本使ってません)
#!/bin/bash
until ! read INPUT_KEY
do
echo ${INPUT_KEY}
done
使い方-3(基本使ってません)
#!/bin/bash
# data.txt内の文字列を1行づつ読み込んだものを表示する
until ! read LINE
do
echo ${LINE}
done < data.txt
使い方-4
#!/bin/bash
# 「COUNT」変数の初期値
COUNT=1
# 条件が成り立たない間繰り返し
until [[ ${COUNT} -gt 10 ]]
do
echo ${COUNT}
COUNT=$(( COUNT + 1 ))
done
値のリスト個数分の繰り返し(ループ)処理
for文
値のリストに基づいて決められた回数のループで処理をしたい場合に使用します。
値のリストにある値の個数分のループを処理します。
文法
for 変数 in 値のリスト
do
処理
done
使い方-1
#!/bin/bash
# 引数の個数チェック
if [[ ${#} -ne 0 ]] && [[ ${#} -gt 10 ]] ; then
echo 引数は1個から10個まで必要です。
exit 1
fi
# 10回ループ(特殊変数「${@}」で引数の個数)
for i in "${@}"
do
echo "${i}"
done
使い方-2
#!/bin/bash
# 10回ループ(ブレース展開)
for i in {1..10}
do
echo "${i}"
done
使い方-3
#!/bin/bash
# 10回ループ(こんな書き方もできる)・・・あまり使わないか
for ((i = 1; i <= 10; i++)) {
echo "${i}"
}
select文
選択肢に番号をつけて表示し、選択された値を変数に代入して処理を行いたい場合に使用します。処理は、breakかEOFを受け取るまで、繰り返されます。
文法
select 変数 in 値のリスト
do
変数に応じた処理
done
使い方
#!/bin/bash
select ACTION in "select 1" "select 2" "select 3" "select 4" "exit"
do
echo "${ACTION}"
if [[ ${ACTION} = "exit" ]] ; then
break
fi
done
処理の中止と継続
処理の途中で、処理の中止および継続をしたい場合に使用します。
break
使い方
#!/bin/bash
# カウンターの初期化をする
COUNT=1
# 現在の曜日を変数に代入する
DAY_OF_WEEK=$(date +%a)
while [ ${COUNT} -le 3 ]
do
# 日曜日であれば繰り返し処理を中止する
if [[ ${DAY_OF_WEEK} = Sun ]]; then
break
fi
echo ${COUNT}
COUNT=$(( COUNT + 1 ))
done
continue
使い方
#!/bin/bash
# カウンターの初期化をする
COUNT=1
# 現在の曜日を変数に代入する
DAY_OF_WEEK=$(date +%a)
while [ ${COUNT} -le 3 ]
do
# 日曜日であれば繰り返し処理を継続する
if [[ ${DAY_OF_WEEK} = Sun ]]; then
continue
fi
echo ${COUNT}
COUNT=$(( COUNT + 1 ))
done