ウェブサイト検索

Bashにおける条件論理をマスターする方法


条件ロジックの使用は、あらゆるプログラミング言語において非常に重要な部分です。条件ロジックは、プログラミングの問題を解決するために、Bashでさまざまな方法で実装できます。このチュートリアルでは、文字列や数値を比較するためのさまざまな種類の「if」文や「case」文、変数の内容をチェックする方法、ファイルやディレクトリの存在を確認する方法など、Bashにおける条件ロジックの使用方法を示します。

コンテンツのリスト:

  1. 「もし」文の使用
  2. 「If-Else」ステートメントの使用
  3. 「If-Elif-Else」ステートメントの使用
  4. 空の変数をチェックするための「もし」ステートメントの使用
  5. 論理演算子を使用した「もし」文の使い方
  6. ネストされた「If」ステートメントの使用
  7. ファイルの存在を確認するための「If」文の使用
  8. ディレクトリの存在を確認するための「If」ステートメントの使用
  9. 正規表現を使った「If」文の使用
  10. 「ケース」ステートメントの使用

「もし」という文の使い方

この例は、Bashにおける「if」文の簡単な使い方を示しています。Bashで数値を比較するために使用できる6つのタイプの比較演算子があります。これらは「-eq」(等しい)、「-ne」(等しくない)、「-le」(以下)、 「-ge」(以上)、「-lt」(未満)、および「-gt」(超過)です。「-lt」と「-eq」の使い方は、次のスクリプトで示されており、数が99より小さいか、「-lt」演算子を使用してチェックされていないかどうかを確認します。数は偶数か奇数かであり、「-eq」演算子でチェックされます。

#!/bin/bash

#Assign a numeric value

((number=50))

#Check the numeric value using 'if' statement

if [ $number -lt 99 ]

then

echo "Number is valid."

fi

#Check whether the number is even or not

if [ $(( $number % 2 )) -eq 0 ]

then

echo "Number is even."

fi

出力:

前のスクリプトを実行した後に以下の出力が表示されます:

「If-Else」文の使用

「if-else」文の使用は、以下のスクリプトに示されています。ユーザーから文字列の値を取得し、その値が「BLUE」であるかどうかを「if-else」文を使ってチェックします。

#!/bin/bash

#Take a string value from the user

read -p "Enter your favorite color:" color

#Check the string value using 'if-else' statement

if [ ${color^^} == 'BLUE' ]

then

echo "Fine, Blue color is available."

else

echo "$color is not available."

fi

出力:

前のスクリプトを実行した後、入力として「赤」を指定すると、次のような出力が表示されます:

前のスクリプトを実行した後、入力として「青」を指定すると、次のような出力が表示されます:

「If-Elif-Else」ステートメントの使用

「if-elif-else」文の使用は、次のスクリプトに示されています。ユーザーから数値を取得し、異なる値と照合して、一致が見つかるまで確認します。一致が見つかった場合、対応するメッセージが表示されます。一致が見つからない場合は、デフォルトのメッセージが表示されます。

#!/bin/bash

#Take the id value from the user

read -p "Enter your serial number:" serial

#Check the input value using the 'if-elif-else' statement

if [ $serial == '4523' ]

then

echo "You are selected in group A."

elif [ $serial == '8723' ]

then

echo "You are selected in group B."

elif [ $serial == '3412' ]

then

echo "You are selected in group C."

else

echo "You are not selected".

fi

出力:

スクリプトを8723の値で実行した後、次の出力が表示されます:

スクリプトを9078の値で実行した後、次の出力が表示されます:

空の変数をチェックするための「If」ステートメントの使用

変数が空であるかどうかを確認する方法は、次のスクリプトに示されています。このタスクを実行するために、「if」ステートメントでは「-z」オプションが使用されます。

#!/bin/bash

#Take the id value from the user

read -p "Enter your serial number:" serial

#Check whether the variable is empty or not

if [ ! -z $serial ]

then

#Check the input value using 'if-elif-else' statement

if [ $serial == '690' ]

then

echo "You are selected in team-1."

elif [ $serial == '450' ]

then

echo "You are selected in team-2."

else

echo "You are not selected".

fi

else

echo "No serial number is given."

fi

出力:

スクリプトを690の値で実行した後に次の出力が表示されます:

入力値が取られない場合、スクリプトを実行した後に以下の出力が表示されます:

論理演算子を用いた「もし」文の使い方

Bash の条件文では三種類の論理演算子を使用できます。これらは論理和(||)、論理積(&&)、および論理否定(!)です。コードの値はユーザーから取得されます。入力された値が空でない場合、その値は論理和を使用して二つのコード値と照合されます。値がいずれかのコードと一致する場合、対応するメッセージが印刷されます。一致するコードが見つからない場合、デフォルトのメッセージが印刷されます。

#!/bin/bash

#Take the course code from the user

read -p "Enter the course code:" code

#Check whether the variable is empty or not

if [ ! -z $code ]

then

#Check the input value using the 'if-elif-else' statement

if [[ $code == 'CSE-106' || $code == 'CSE-108' ]]

then

echo "CSE course."

elif [[ $code == 'BBA-203' || $code == 'BBA-202' ]]

then

echo "BBA course."

else

echo "Invalid course code."

fi

else

echo "No course code is given."

fi

出力:

「CSE-108」という入力値でスクリプトを実行した後、次の出力が表示されます:

「BBA-56」という入力値でスクリプトを実行した後、次の出力が表示されます:

入れ子の「if」文の使用

他の「if」条件内で「if」条件が使用されると、それはネストされた「if」ステートメントと呼ばれます。ネストされた「if」を使用する方法は、次のスクリプトに示されています。ユーザーから2つのマーク値を取得します。入力値が空でない場合、最初の「if」条件は「$theory」の値が60以上かどうかを確認します。最初の「if」条件が「true」を返す場合、2番目の「if」条件は「$lab」の値が50以上かどうかを確認します。2番目の「if」条件も「true」を返す場合、成功メッセージが印刷されます。そうでない場合は、失敗メッセージが印刷されます。

#!/bin/bash

#Take the theory mark

read -p "Enter the theory mark:" theory

#Take the lab mark

read -p "Enter the lab mark:" lab

#Check whether the variables are empty or not

if [[ ! -z $theory && ! -z $lab ]]

then

#Check the input values using a nested 'if' statement

if [ $theory -ge 60 ]

then

if [ $lab -ge 50 ]

then

echo "You have passed."

else

echo "You have failed."

fi

else

echo "You have failed."

fi

else

echo "Theory or lab mark is empty."

fi

出力:

入力値のどちらか一方または両方が空の場合、次の出力が表示されます:

78を理論点数として、45を実験点数として取ると、以下の出力が表示されます。ここで、2番目の「もし」条件は「偽」を返します。

67が理論点として、56が実験点として取られる場合、次の出力が現れます。ここでは、両方の「もし」条件が「真」を返します:

以下の出力は、理論の点数に50、実験の点数に80を取ると表示されます。ここで、最初の「もし」の条件は「偽」と返します。

ファイルの存在を確認するための「If」ステートメントの使用

ファイルの存在は、bashスクリプトで2つの方法で確認できます。1つは「[]」ブラケットと一緒に「-f」演算子を使用することです。もう1つは「test」コマンドと「-f」演算子を使用することです。ファイル名を取得し、「if」条件と「-f」演算子を使用してファイルの存在を確認します。その後、別のファイル名を取得し、「test」コマンドと「-f」演算子を使用してファイルの存在を確認します。

#!/bin/bash

#Take the filename

read -p "Enter a filename:" fn1

#Check whether the file exists or not without using `test`

if [ -f $fn1 ]

then

echo "$fn1 file exists."

else

echo "$fn1 file does not exist."

fi

#Add newline

echo

#Take another filename

read -p "Enter another filename:" fn2

#Check whether the file exists or not using `test`

if test -f $fn2; then

echo "$fn2 file exists."

#Check whether the file is empty or not using `test`

if test -z $fn2; then

echo "$fn2 file is empty."

else

echo "$fn2 file is not empty."

fi

else

echo "$fn2 file does not exist."

fi

出力:

スクリプトを実行し、ファイル名として「test.txt」と「testing.txt」を使用した後、以下の出力が表示されます。出力によると、両方のファイルは現在の場所に存在し、「testing.txt」ファイルは空です。

スクリプトを実行した後、次の出力が表示されます。その際、ファイル名として「f1.txt」と「test.txt」を使用しています。この出力によると、「f1.txt」ファイルは現在の場所には存在せず、「test.txt」ファイルは空ではありません:

ディレクトリの存在を確認するための「If」ステートメントの使用

ディレクトリの存在は、Bashスクリプトでファイルと同様に2つの方法で確認できます。1つは「[]」ブラケットと「-d」オペレーターを使用する方法です。もう1つは「test」コマンドと「-d」オペレーターを使用する方法です。ディレクトリ名を取得し、「if」条件と「-d」オペレーターを使用してディレクトリの存在を確認します。次に、別のディレクトリ名を取得し、「test」コマンドと「-d」オペレーターを使用してファイルの存在を確認します。

#!/bin/bash

#Take a directory name

read -p "Enter a directory name:" dir1

#Check whether the directory exists or not without using `test`

if [ -d $dir1 ]

then

echo "$dir1 directory exists."

else

echo "$dir1 directory does not exist."

fi

#Add newline

echo

#Take another directory name

read -p "Enter another directory name:" dir2

#Check whether the file exists or not using `test`

if test -d $dir2

then

echo "$dir2 directory exists."

else

echo "$dir2 directory does not exist."

fi

出力:

スクリプトを「temp」と「files」というディレクトリ名で実行した後、次の出力が表示されます。出力によると、両方のディレクトリは現在の場所に存在します。その後、「ls」コマンドが実行され、ディレクトリの内容が確認されます。

スクリプトを「testing」と「new」というディレクトリ名で実行した後、以下の出力が表示されます。出力によると、現在の場所に両方のディレクトリは存在しません。その後、「ls」コマンドの出力は、両方のディレクトリが存在しないことを示しています。

正規表現と「もし」ステートメントの使用

以下のスクリプトは、正規表現を使用した「if」文を使って入力データを検証する方法を示しています。ここでは、ユーザーから取得した2つの入力値が「$bookname」と「$bookprice」変数に格納されます。「if」条件は、スクリプトで「$bookname」変数がすべてのアルファベット文字を含むかどうかと、「$bookprice」が数字を含むかどうかを確認するために使用されます。

#!/bin/bash

#Take the book name and price from the user

echo -n "Enter the book name:"

read bookname

echo -n "Enter the book price:"

read bookprice

#Check the book name contains the alphabet only

if ! [[ "$bookname" =~ [A-Za-z] ]]; then

echo "Book name is invalid."

else

echo "Book name is valid."

fi

#Check the book price contains digit only

if ! [[ "$bookprice" =~ [0-9] ]]; then

echo "Book price can contain digit only."

else

echo "Book price is valid."

fi

出力:

「Bash Programming」という書名と78という書籍価格の入力値でスクリプトを実行した後、以下の出力が表示されます:

スクリプトを実行し、入力値として90を本の名前、“Bash ”を本の価格として使用した後、以下の出力が表示されます:

「ケース」ステートメントの使用

「case」文は「if-elif-else」文の代替ですが、「if-elif-else」文で行えるすべてのタスクは「case」文を使って行うことはできません。「case」文の簡単な使用法は、以下のスクリプトに示されています。数値が現在の月としてユーザーから取得されます。そして、「case」文で一致する値が見つかれば対応する月が印刷されます。そうでなければ、デフォルトメッセージが印刷されます。

#!/bin/bash

#Take the current month value in number

read -p "Enter the month of today in number:" b_month

#Print the text before printing the month name

echo -n "The current month name is "

#Find out and print the matching month name based on the input

case $b_month in

1|01) echo "January." ;;

2|02) echo "February." ;;

3|03) echo "March." ;;

4|04) echo "April." ;;

5|05) echo "May." ;;

6|06) echo "June." ;;

7|07) echo "July." ;;

8|08) echo "August." ;;

9|09) echo "September." ;;

10) echo "October." ;;

11) echo "November." ;;

12) echo "December." ;;

*) echo "not found." ;;

esac

出力:

スクリプトを値6で実行した後、次の出力が表示されます。

スクリプトを09の値で実行した後に次の出力が表示されます:

スクリプトを実行した後、値が14のとき次の出力が表示されます:

結論

このチュートリアルの10の例では、「if」と「case」文を使用した条件論理の異なる使い方が示されています。このチュートリアルを読むことで、新しいBashユーザーのためにBashにおける条件論理の概念が明確になるでしょう。