シェルスクリプト · 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

Linuxのswitch文

結論

bashシェルは、プログラマーにとって多くの便利なツールを提供します。今日のほとんどのプログラミング言語と同様に、条件付きの意思決定を行うことができ、シェルスクリプトをよりインタラクティブで賢くします。次のシリーズでは、繰り返し制御構造を特集します。それでは次回まで。

参考文献

次のレッスン: 繰り返し制御構造

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。