Bash If Elseとその他の条件文の理解

Bourne Again Shell(Bash)スクリプトを作成することは、特にそのロジックを追加して堅牢性を確保する場合、満足感のある経験になることがあります。スクリプトをよりスマートにするための一つの方法は、条件文を使用することです、特に「bash if else」です。

この詳細な解説では、Bashのif-elseやcase文の力と微妙なニュアンスを把握することになります。これにより、エラーのない、インテリジェントなBashスクリプトを作成するのに役立ちます。また、プロのようにスクリプトを作成するためのベストプラクティスもいくつか紹介します。

興奮していますか?掘り下げて、Bashスクリプトの技術を向上させましょう!

舞台を設定する:前提条件

このチュートリアルを最大限に活用するために、いくつかの必要なものを用意しておく必要があります:

  • A Linux or Windows system armed with Bash. For those on Windows, the Windows Subsystem for Linux (WSL) is your best bet.
  • A code/text editor to write and refine your ‘bash if else’ scripts.

なぜbash if else文を活用すべきですか?

Bashスクリプトで条件文がなぜ尊重されるのか?簡単に言えば、事前に定義された条件に基づいて、スクリプトに意思決定の能力を付与します。

たとえば、「bash if else」を使用して、ファイルが存在するかどうかを確認してから削除を試みることができます。また、リソースにアクセスする前にユーザーが必要な権限を持っているかどうかを確認したい場合もあります。

「bash if else」の構造をスクリプトに組み込むことは、柔軟性だけでなく、効果も高めます。フォルダ内のすべてのファイルを削除するスクリプトを想像してみてください。「bash if else」を使用することで、30日以上経過したファイルのみを手術的に削除し、他のファイルを保護することができます。

「bash if else」文にダイブする

さあ、紹介はこれくらいにして、実際の作業に入りましょう。まずは、最も広く受け入れられている条件文のひとつ、 「bash if else」文から始めましょう。

「bash if else」文は、Bashスクリプトに条件分岐を挿入するためのゲートウェイです。以下にそのエレガントな構文をご覧ください。

  • ifキーワードで始まり、[[ ]]で囲まれた条件が続きます。その後、 「bash if else」文内のコードが実行され、fiキーワードで終了します。
  • thenキーワードは、条件が満たされた場合に実行されるアクション(またはステートメント)を条件から分離します。このアクションブロックは、セミコロン(;)で区切られた複数の行にまたがることができます。
if [[ condition ]]; then
	statement
fi

ログインシステムのスクリプトを想像してみてください。正しいユーザー名を入力するように促され、アクセスが許可されます。

1. ターミナルを起動し、お好みのテキストエディタを使用して新しいbash_if_demo.shファイルを作成します。これは「bash if else」文を理解するためのプレイグラウンドとなります。

nano bash_if_demo.sh

2. 以下に示す「bash if else」の例を、bash_if_demo.shファイルに埋め込んでください。挿入後、変更内容を保存してエディタを終了してください。

「bash if else」スクリプトのサンプルでは、ユーザ名を入力するようにプロンプトが表示されます。期待するユーザ名が入力された場合、現在の日付と時刻が補足された歓迎メッセージが表示されます。

ユーザのアクセス試行の日付と時刻を記録しておくことは、将来の分析に非常に役立ちます。

イントロダクションの行「#!/bin/bash」(一般的にはシェバングとして知られています)は、スクリプト内の後続のコードを処理するためにシステムに対して使用するインタプリタを指示します。ここでは、私たちが選んだインタプリタは「bash」です。

#!/bin/bash
# 画面に質問を表示します。
echo "Whats your name?"
# キーボードの入力をキャプチャし、$NAME 変数に格納します
read NAME
# 'bash if else' ステートメントを開始し、$NAME の値が
# "ATA" と一致するかどうかを調べます。一致する場合は、囲まれたコードが実行されます。一致しない場合はスキップされます。
if [ $NAME == "ATA" ]
then
  # $NAME の値が "ATA" と等しい場合にのみメッセージを表示します。
  echo "Welcome back ATA!"
fi
# 'bash if else' の外側では、常に現在の日付と時刻が表示されます。
date

3. さて、今度は「bash if else」スクリプトをテストしてみましょう。以下のコマンドを実行してください:

bash bash_if_demo.sh

Bashシェルのバリアントに関係なく、スクリプト名の前に「bash」を付けてください。これにより、システムはスクリプトの実行にBashを利用します。

「ATA」と入力してEnterキーを押してください。結果は以下のようになります:

Demonstration of the bash_if_demo.sh ‘bash if else’ Script

「ATA」以外の入力を行うと、歓迎メッセージは出力されません。現在の日付と時刻のみが表示されます。この動作は、$NAME変数の値と正確に一致するかどうかをチェックする「bash if else」ステートメントによるものです。

なお、「bash if else」ステートメントは大文字と小文字を区別します。したがって、「ata」、「aTa」、「Ata」などは、「ATA」とは異なります。

Outcome on Entering a Non-matching Value

常に異なる入力で「bash if else」スクリプトをテストしてください。これにより、スクリプトが予想通りに動作することが保証されます。

さらに深く掘り下げる: ネストされた「bash if else」ステートメント

すでに「bash if else」ステートメントの基礎を理解しています。これは、単純なタスクには十分ですが、複雑なスクリプトでは高度な構造が求められます。そのような場合には、ネストされた「bash if else」ステートメントが役立ちます。基本的に、これは1つまたは複数の追加の「if」ステートメントを含む「if」ステートメントです。

以下の構造は、ネストされた「bash if else」ステートメントの基本的な構文を示しています。ここでは、外側のif [[ conditions ]]節が条件の達成に基づいて実行されるコードを囲みます。私たちの文脈では、ネストされたコードは別の「if」ステートメントです。

  • if [[ 条件 ]] – これは外部の「bash if else」ステートメントを表します。指定された条件が真である場合にのみ、入れ子のコード(別の ‘if’ ステートメント)が実行されます。
  • if [[ 条件2 ]] – これは内部の「bash if else」節を表します。両方の条件が満たされた場合にのみ実行されるコードを保持します。
if [[ conditions ]]; then
	if [[ condition2 ]]; then
		statement
	fi
fi

さらに掘り下げましょう。前の「bash if else」の例を拡張し、今度はパスワードについて尋ねるifステートメントを含めます。

1. まず、お気に入りのテキストエディタを使用してbash_nested_if_demo.shという新しいファイルを作成します。

nano bash_nested_if_demo.sh

2. 下記の ‘bash if else’ コードをbash_nested_if_demo.shファイルに転送し、変更を保存してエディタを閉じます。

この ‘bash if else’ コードは、名前とパスワードの条件が一致する場合に特定のメッセージが表示されます。一致しない場合は、出力に現在の日付と時刻が表示されます。

#!/bin/bash
# ユーザー名を促すメッセージを提出します。
echo "Whats your name?"
# ユーザー入力を収集します。
read NAME
# 'bash if else' ステートメントを開始して、$NAME が "ATA" に一致するかどうかを検証します。
if [ $NAME == "ATA" ]
 then
 # 次の質問を提示します。今回はパスワードです。
 echo "Password?"
 # パスワード入力をキャプチャします。
 read Password
   # ネストされた 'bash if else' - $Password が "pwd123" に対応しているかを確認します。
   if [ "$Password" == "pwd123" ]; then
     # 名前とパスワードの両方の条件が満たされている場合、メッセージを表示します。
     echo "You've successfully logged in as ATA."
   fi
fi
# 現在の日付と時刻を強調表示します。
date

3. 今、この ‘bash if else’ スクリプトを実行しましょう。以下のコマンドを実行します:

bash bash_nested_if_demo.sh

最適な結果を得るには、ユーザー名として ATA、パスワードとして pwd123 を入力してください。

Demonstrating the bash_nested_if_demo.sh Script in action

入力が “ATA” または “pwd123” から逸脱した場合、フィードバックは現在の日付と時刻に関するものだけです。これは、’bash if else’ 構造が両方の条件を満たす必要があるためです。

Validating if entered conditions are met using ‘bash if else’

‘Bash If Else’ ステートメントのデコード

‘Bash if else’ ステートメントは、Bash スクリプトでの基本的なものであり、スクリプトに決定的な機能を提供します。ただし、’if’ ステートメントを使用することには欠点もあります。

目立つ課題は、’if’ への過度な依存がコードを混乱させ、特に複数の入れ子になった ‘if’ 文が関わる場合には、コードを退屈で複雑にする可能性があることです。そのようなスクリプトは、「スパゲッティコード」と呼ばれ、読みやすさが低下し、複雑さが増します。

したがって、「bash if else」スクリプトを理解しやすく保つためにどのようにすればよいですか?入れ子の ‘if’ 文の山よりも ‘if else’ 文を選択します。’else’ キーワードを使用すると、’if’ 条件が満たされない場合に実行するコードチャンクを指定できます。

より明確な視点を得るために、以下の ‘Bash If Else’ の構文を考えてみましょう。ここでは、次のようになります:

  • if [[ 条件 ]] – ここでは、ステートメント1が、指定された条件が有効な場合にのみトリガーされる ‘bash if else’ ステートメントが含まれます。
  • else – これは ‘bash if else’ 構造の一部です。else ステートメントには、前の if 句の条件が満たされない場合に実行されるコード(ステートメント2)が含まれます。
if [[ conditions ]]; then
	statement1
else
	statement2
fi

ユーザーからランダムな数値を期待するシンプルな ‘bash if else’ ゲームを作成することを想像してください:

1. 新しいファイルを bash_if_else_demo.sh という名前で作成します。

nano bash_if_else_demo.sh

2. 次の ‘bash if else’ コードを bash_if_else_demo.sh ファイルに統合し、変更内容を保存して終了します。

基礎となる ‘bash if else’ コードは、ユーザーに彼らの幸運な番号を入力するように促します。入力が偶数の場合、「You Won!」メッセージが表示されます。逆に、奇数の場合は「You Lost!」がトリガーされます。

#!/bin/bash
ユーザーのラッキーナンバーをリクエストする放送
echo -n "Input Your Lucky Number:"
入力された数字を受け入れる
read var
'bash if else' 条件で値が偶数かどうかを確認する
if [ $((var%2)) == 0 ]; then
 条件が満たされた場合、勝利を発表する
 echo "You Won with 'bash if else'!"
else
 条件が満たされない場合、敗北を発表する
 echo "You Lost using 'bash if else'!"
fi

3. 操作中の ‘bash if else’ スクリプトを確認するには、以下のコマンドを実行してください:

bash bash_if_else_demo.sh

偶数の数字を入力すると、「’bash if else’ で勝ちました!」というメッセージが表示されます。逆に、奇数の数字を入力すると、「’bash if else’ を使用して負けました!」というフィードバックが得られます。

Run the ‘bash if else’ game, bash_if_else_demo.sh Script

‘bash if else’ スクリプトを充実させるために、ユーザーが数字ではなく文字や独自の文字を入力したかどうかを判定するセグメントを組み込むことを検討してください。

‘Bash If Else’ と Case ステートメントの解読

この時点で、Bash スクリプトでの意思決定の方法のいくつかを探索してきました。具体的には、’bash if else’ ステートメントです。しかし、Bash には別の意思決定の手段があります – case ステートメントです。

‘bash if else’ と同様に、case ステートメントは特定の条件に基づいて実行するコードシーケンスを指定するのに適しています。case ステートメントの顕著な利点は、ネストされた ‘bash if else’ シナリオと比較した際に、その非常に簡潔さと明瞭さにあります。

「bash if else」の代替手段を完全に理解するには、ケース文の構文について詳しく見てみましょう:

  • case $VAR in – このケース構造のセグメントは、一致するまで定義されたパターンに対して$VAR変数を評価します。
  • pattern1)およびpattern2) – これらはテストする基準であり、一致が検出されると、対応するコード(statement1またはstatement2)が実行されます。
  • esac – ケース構造を終了します。
case $VAR in
pattern1)
    statement1
    ;;
pattern2)
    statement2
    ;;
esac

国名を入力すると、その国の主要な言語が表示される ‘bash if else’ スクリプトを設計していると想像してみてください。

1. bash_case_demo.shという名前のファイルを作成します。

nano bash_case_demo.sh

2. 提供された ‘bash if else’ コードをbash_case_demo.shファイルに組み込み、保存して終了します。

次の ‘bash if else’ スクリプトでは、ユーザーに国名を入力させ、 ‘case’ パターンに基づいて、指定された国で話されている主要な言語を表示します。

3#!/bin/bash
# ユーザーに居住国に関するクエリを提案します
echo -n "In which country do you reside?"
# ユーザーの応答をキャプチャします。
read var
# ユーザーが選択した国の標準言語($var)を特定します
# 'case'フレームワーク内のパターンに依存します。
echo -n "The official language of $var is "

# 'bash if else' case文は、ユーザーの入力($var)がパターンと一致するかどうかを評価します。
case $var in
# ユーザーの選択した国の主要言語を明らかにするパターンを確立します。
 US)
  echo -n "English"
  ;;

 Canada)
  echo -n "English and French"
  ;;

 Algeria | Bahrain | Egypt| Jordan)
  echo -n "Arabic"
  ;;

 *)
  echo -n "unknown"
  ;;
esac

3. この「bash if else」スクリプトを直接体験するには、次のコマンドを使用します:

bash bash_case_demo.sh

スクリプトがユーザーの選択した国に応じて言語を正確に強調していることがわかります。

提供された国が指定されたパターンと一致しない場合、デフォルト(*)パターンがトリガーされ、「unknown」という出力が生成されます。

Illustrating the functionality of the bash_case_demo.sh Script

Bash条件文をまとめる

このガイドでは、「bash if else」およびその他のBash条件文の理解の旅に乗り出しました。単純な「if」文から複雑な「if-else」および「case」文まで、効果的なBashスクリプト作成のための必須ツールを備えています。

これらの「bash if else」の基礎を身につけることで、エラーの余地を減らしながら、より熟練したBashスクリプトを構築できます。

ただし、これはまさに氷山の一角に過ぎません。 Bashにはさまざまな条件文が用意されています。おそらく、Bashのelif文と&&、OR、||演算子に深く入り込んでみることを考えてみてください。献身的な努力によって、Bashスクリプトのマスタリングはすぐに手に入るでしょう!

Source:
https://adamtheautomator.com/bash-if-else/