Linux講座にようこそ。このページは「Linuxの使い方 - 第6章 シェルスクリプトの作り方」です。

Linuxの使い方

6. シェルスクリプトの作り方(6/8)

6.7 制御演算(2/2)

6.7.4 forコマンド

forコマンドは先頭で変数に値を設定しつつ繰り返します。設定する値が無くなったら繰り返しを終了します。

形式

変数には形式1の場合はin以降で指定した値が、形式2の場合は位置パラメータの値が設定されます。

※ 形式1
for 変数 in 値1 値2 … 値n ← 変数に値1から値nを設定しつつ繰り返します
do
  コマンドリスト
done

※ 形式2
for 変数 ← 変数に位置パラメータの値を設定しつつ繰り返します
do
  コマンドリスト
done

例題

例題1

ディレクトリの絶対パス名を記述したファイル(ディレクトリ・リスト)を入力し、そのディレクトリが存在するかをチェックします。(ex53.sh)

#!/bin/bash
# 機能 :  ディレクトリの絶対パス名を記述したファイルを入力し、
#         そのディレクトリが存在するかをチェックします
# 作成 :  メリー
 
dirlist_path=${1:?"ディレクトリ・リストの指定がありません。中止します。"}
 
# ディレクトリ・リストの有無をチェック
if [[ ! -f "$dirlist_path" ]]
then
    echo "${dirlist_path}がありません。中止します。"
    exit 1;
fi
 
for path in $(cat $dirlist_path)    # pathにはcatコマンドの実行結果が順番に設定される
do
    # ディレクトリとして存在するかをチェック
    if [[ -d "$path" ]]
    then
        echo "${path}はディレクトリとして存在します。"
    else
        echo "${path}はディレクトリとして存在しません。"
    fi
done
$ cat ./mybin/ex53_1.conf ← ディレクトリ・リストの内容を表示します
/home/merry/TMP/WORK
/home/merry/TMP/DUMMY
/home/merry/TMP/PHOTO
$
$ ex53.sh ./mybin/ex53_1.conf
/home/merry/TMP/WORKはディレクトリとして存在します。
/home/merry/TMP/DUMMYはディレクトリとして存在しません。
/home/merry/TMP/PHOTOはディレクトリとして存在します。
$
例題2

引数に指定されたディレクトリが存在するかをチェックします。(ex54.sh)

#!/bin/bash
# 機能 :  引数に指定されたディレクトリが存在するかをチェックします
# 作成 :  メリー
 
# 引数の有無をチェック
if (( $# == 0 ))
then
    echo "ディレクトリの指定がありません。中止します。"
    exit 1;
fi
 
for path                     # pathには引数に指定された値が順番に設定される
do
    # ディレクトリとして存在するかをチェック
    if [[ -d "$path" ]]
    then
        echo "${path}はディレクトリとして存在します。"
    else
        echo "${path}はディレクトリとして存在しません。"
    fi
done
$ ls -l
合計 12
drwxr-xr-x 2 merry merry 4096 12月  7 09:12 'My Documents'
drwxr-xr-x 2 merry merry 4096 12月  7 09:13 'Program Files'
drwxr-xr-x 2 merry merry 4096 12月  7 09:22  SCRIPT
$
$ ex54.sh ← 引数を指定しません
ディレクトリの指定がありません。中止します。
$
$ ex54.sh ./SCRIPT ./SCRIPT/ex01.sh My Documents 'My Documents' ← パス名を複数指定します
./SCRIPTはディレクトリとして存在します。
./SCRIPT/ex01.shはディレクトリとして存在しません。
Myはディレクトリとして存在しません。
Documentsはディレクトリとして存在しません。
My Documentsはディレクトリとして存在します。
$

6.7.5 whileとuntilコマンド

whileコマンドとuntilコマンドは繰り返しを制御します。whileコマンドは条件が成立(真)の間繰り返します。それに対して、untilコマンドは条件が不成立(偽)の間繰り返します。これらのコマンドで繰り返しの処理をする場合は、次のことに注意する必要があります。

  • whileコマンドの場合は、繰り返しに入る前に条件がになるような処理を行わないと、繰り返しを行わないで直ちに繰り返しを抜けてしまいます。
  • untilコマンドの場合は、繰り返しに入る前に条件がになるような処理を行わないと、繰り返しを行わないで直ちに繰り返しを抜けてしまいます。
  • 繰り返しの中で何らかの手段で条件を変えないと、永久ループになってしまいます。

形式

※ whileコマンド
while 条件
do
  コマンドリスト ← 条件を偽に変えるようなコマンドが必要です
done

※ untilコマンド
until 条件
do
  コマンドリスト ← 条件を真に変えるようなコマンドが必要です
done

例題

例題1

whileコマンドで繰り返し四則演算を行います。(ex55.sh)

#!/bin/bash
# 機能  :  繰り返し四則演算を行います
# 作成  :  メリー
 
cont="y"
while [[ "$cont" = "y" ]] || [[ "$cont" = "Y" ]]
do
    echo -e "(+)加算\n(-)減算\n(*)乗算\n(/)除算"
    read -p "演算子を入力して下さい --> " enzansi
 
    if [[ -n "$enzansi" ]]
    then
        read -p "数値を2つ入力して下さい --> " atai1 atai2
        if [[ -n "$atai1" ]] && [[ -n "$atai2" ]]
        then
            case "$enzansi" in
                '+' ) echo "$atai1 + $atai2 = " $(( $atai1 + $atai2 ));;
                '-' ) echo "$atai1 - $atai2 = " $(( $atai1 - $atai2 ));;
                '*' ) echo "$atai1 * $atai2 = " $(( $atai1 * $atai2 ));;
                '/' ) echo "$atai1 / $atai2 = " $(( $atai1 / $atai2 ));;
                * ) echo "演算子が不当です";;
            esac
        else
            echo "数値が入力されませんでした"
        fi
    else
        echo "演算子が入力されませんでした"
    fi
 
    read -p "計算を続けますか(y/n) ---> " cont        # 条件を変える
done
 
echo "終了します"
$ ex55.sh
(+)加算
(-)減算
(*)乗算
(/)除算
演算子を入力して下さい --> +
数値を2つ入力して下さい --> 10 20
10 + 20 =  30
計算を続けますか(y/n) ---> y ← "y"を入力して繰り返します
(+)加算
(-)減算
(*)乗算
(/)除算
演算子を入力して下さい --> -
数値を2つ入力して下さい --> 10 10
10 - 10 =  0
計算を続けますか(y/n) ---> Y
(+)加算
(-)減算
(*)乗算
(/)除算
演算子を入力して下さい --> *
数値を2つ入力して下さい --> 10 -10
10 * -10 =  -100
計算を続けますか(y/n) ---> n ← "n"を入力して終了します
終了します
$
例題2

untilコマンドで繰り返し四則演算を行います。(ex56.sh)

#!/bin/bash
# 機能  :  四則演算を行います
# 作成  :  メリー
 
cont="y"
until [[ $cont = "n" ]] || [[ $cont = "N" ]]
do
    (以下省略)