シェルスクリプト · 2 min read · Nov 13, 2025
シェルスクリプト パート3: シェルスクリプトにおける意思決定制御構造
こんにちは!前回のチュートリアルのパート1とパート2では、入力を受け取り、算術演算を通じてデータを処理し、出力を生成して表示するというシェルスクリプトの基本をカバーしました。このパートでは、プログラミング言語のより高度なトピック、つまりプログラム内での意思決定について深く掘り下げていきますが、今回はbashシェルを使用して行います。それでは始めましょう!
はじめに
今日のほとんどのプログラミング言語は、設定した条件に基づいて意思決定を行うことができます。条件とは、真または偽のブール値に評価される式です。プログラマーは、プログラムに組み込む意思決定と論理に基づいて、自分のプログラムを賢くすることができます。bashシェルは、ifおよびswitch(case)意思決定文をサポートしています。
If文
Ifは、プログラマーが指定した条件に基づいてプログラム内で意思決定を行うことを可能にする文です。条件が満たされると、プログラムは特定のコード行を実行し、そうでない場合は、プログラマーが指定した他のタスクを実行します。以下は、bashシェルでサポートされているif文の構文です。
一般的な構文
単一の意思決定:
if
then
### ここにコードの一連があります
fi 二重の意思決定:
if
then
### 条件が満たされた場合のコードの一連
else
### 条件が満たされなかった場合のコードの一連
fi 複数のif条件:
if
then
### condition1のためのコードの一連
elif
then
### condition2のためのコードの一連
else
### 条件が満たされなかった場合のコードの一連
fi 単一ブラケット構文
if [ condition ]
then
### ここにコードの一連があります
fi二重ブラケット構文
if ((condition))
then
### ここにコードの一連があります
fi単一ブラケット構文は、bashシェルでサポートされている最も古い構文です。これは、Linuxのすべての条件文と一緒に使用されます。一方、二重括弧構文は、プログラマーにとって親しみやすい構文を提供するために、数値ベースの条件文に使用されます。すべてのタイプのif文は、タスクを実行するために指定された条件が必要です。
Linuxの条件文
条件文は、意思決定制御文と一緒に使用されます。bashシェルで使用できるさまざまなタイプの条件文があり、最も一般的なものは、ファイルベース、文字列ベース、算術ベースの条件です。
ファイルベースの条件
ファイルベースの条件は単項式であり、ファイルの状態を調べるために頻繁に使用されます。以下のリストは、bashシェルで最も一般的に使用されるファイルベースの条件を示しています。
| 演算子 | 説明 |
| -a file | ファイルが存在する場合は真を返す |
| -b file | ファイルが存在し、ブロック特殊ファイルである場合は真を返す |
| -c file | ファイルが存在し、キャラクター特殊ファイルである場合は真を返す |
| -d file | ファイルが存在し、ディレクトリである場合は真を返す |
| -e file | ファイルが存在する場合は真を返す |
| -r file | ファイルが存在し、読み取り可能である場合は真を返す |
| -s file | ファイルが存在し、サイズがゼロより大きい場合は真を返す |
| -w file | ファイルが存在し、書き込み可能である場合は真を返す |
| -x file | ファイルが存在し、実行可能である場合は真を返す |
| -N file | ファイルが存在し、最後に読み取られてから変更されている場合は真を返す |
ファイルベースの意思決定
bashスクリプトでファイルベースの意思決定を構築する方法を示す例を見てみましょう。この例では、ホームディレクトリにファイルが存在するかどうかを判断するスクリプトを作成します。
#!/bin/bash
cd
ls
if [ -e sample.sh ]
then
echo "ファイルは存在します!"
else
echo "ファイルは存在しません"
fi
この例では、cdコマンドを使用してシェルが現在のアクティブディレクトリに関係なくホームディレクトリに戻ることを保証しました。さらに、lsコマンドは、ディレクトリ内のファイルのリストを表示するために使用され、ファイルが本当に存在するかどうかを確認します。ご覧のとおり、スクリプトは「ファイルは存在します!」というテキストを出力します。なぜなら、sample.shがホームディレクトリにあるからです。
注意: シェルコンパイラは、特にスペースに関して構文が非常に厳密です。ifと開きブラケットの間、ブラケットと条件の間にはスペースが必要です。次に、ユーザーがスクリプト名を入力し、指定されたファイルの権限を判断できるようにして、スクリプトを改善しましょう。
#!/bin/bash
cd
ls -l
read -p "ファイル名を入力してください: " filename
if [ -e $filename ]
then
echo "ファイルは存在します!"
if [ -r $filename ]
then
status="読み取り可能 "
fi
if [ -w $filename ]
then
status=$status"書き込み可能 "
fi
if [ -x $filename ]
then
status=$status"実行可能"
fi
echo "ファイルの権限: "$status
else
echo "ファイルは存在しません"
fi
文字列ベースの条件
ユーザー入力に基づいて意思決定を行うことも、bashシェルで可能です。文字列ベースの条件は、指定された条件が満たされる場合は真を返し、そうでない場合は偽を返すバイナリ式を返します。以下は、一般的に使用される文字列ベースの条件演算子です。
| 演算子 | 説明 |
| == | 文字列が等しい場合は真を返す |
| != | 文字列が等しくない場合は真を返す |
| -n | テストされる文字列がnullでない場合は真を返す |
| -z | テストされる文字列がnullである場合は真を返す |
文字列ベースの条件文を使用したサンプルスクリプトを作成しましょう。このスクリプトでは、ユーザーが2つの文字列を入力し、どちらかの文字列がnullであるか、両方の文字列が等しいか、等しくないかを評価します。
#!/bin/bash
read -p "最初の文字列: " str1
read -p "2番目の文字列: " str2
if [ -z "$str1" ]
then
echo "1番目の文字列はnullです"
elif [ -z "$str2" ]
then
echo "2番目の文字列はnullです"
else
if [ $str1 == $str2 ]
then
echo "文字列は等しい"
else
echo "文字列は等しくない"
fi
fi
算術ベースの条件
シェルは、算術ベースの条件を宣言するためのいくつかの方法を提供します。最初は、古いスタイルの単一ブラケット構文と一緒に使用できる記憶術を使用する方法であり、もう一つは、二重括弧と一緒に使用できる数学に優しい記号を使用する方法です。
以下は、シェルでの算術ベースの条件文に使用できる記憶術のリストです。
| 演算子 | 使用法/説明 |
| -eq | 等しい |
| -ge | より大きいか等しい |
| -gt | より大きい |
| -le | より小さいか等しい |
| -lt | より小さい |
| -ne | 等しくない |
ユーザーから整数を受け取り、その整数がゼロ、負、奇数、または偶数であるかどうかを判断するスクリプトを作成しましょう。
#!/bin/bash
read -p "整数を入力してください: " int1
if [ $int1 -eq 0 ]
then
echo "ゼロ"
elif [ $int1 -lt 0 ]
then
echo "負の数"
else
if [ $((int1%2)) -eq 0 ]
then
echo "偶数"
else
echo "奇数"
fi
fi
二重括弧構文の算術演算子:
| 演算子 | 使用法/説明 |
| == | 等しい |
| >= | より大きいか等しい |
| > | より大きい |
| <= | より小さいか等しい |
| < | より小さい |
| != | 等しくない |
次に、前のスクリプトを再構築し、二重括弧構文を使用しましょう。
#!/bin/bash
read -p "整数を入力してください: " int1
if (( $int1 == 0 ))
then
echo "ゼロ"
elif (( $int1 < 0 ))
then
echo "負の数"
else
if (( $((int1%2)) == 0 ))
then
echo "偶数"
else
echo "奇数"
fi
fi
Switch文
switch文は、シェルスクリプトにおける別の種類の条件文です。これは、プログラマーがif条件文と比較して、変数に対して複数の値を比較することを容易にします。switch文の構文は次のとおりです。
case in
)
##pattern1のためのコードの一連
;;
)
##pattern2のためのコードの一連
;;
)
##patternNのためのコードの一連
;;
*)
##デフォルト文
esac
パターンは変数の可能な値です。各パターンは、パターンのブレーク文として機能する二重セミコロンで区切られています。switch文は、esac文で閉じられます。
#!/bin/bash
clear
read -p "整数1: " int1
read -p "整数2: " int2
echo "======================"
printf "メニュー:
[a] 足し算
[b]引き算
[c]掛け算
[d]割り算
"
echo "======================"
read -p "あなたの選択: " choice
res=0
case $choice in
a)
res=$((int1+int2))
;;
b)
res=$((int1-int2))
;;
c)
res=$((int1*int2))
;;
d)
res=$((int1/int2))
;;
*)
echo "無効な入力"
esac
echo "結果は: " $res
結論
bashシェルは、プログラマーにとって多くの便利なツールを提供します。今日のほとんどのプログラミング言語と同様に、条件付きの意思決定を行うことができ、シェルスクリプトをよりインタラクティブで賢くします。次のシリーズでは、繰り返し制御構造を特集します。それでは次回まで。
参考文献
- http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html
- https://linuxacademy.com/blog/linux/conditions-in-bash-scripting-if-statements/
次のレッスン: 繰り返し制御構造
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。