シェルスクリプト(bash)の制御構文

スポンサーリンク

シェルスクリプトの制御構文について、文法と使い方を簡単にまとめてみました。

分岐処理の制御構文

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