GNU/Linux >> Linux の 問題 >  >> Linux

Bash初心者シリーズ#7:IfElseおよびCaseステートメントを使用した意思決定

bashスクリプトをインテリジェントにしましょう!

bash初心者シリーズのこのパートでは、bashスクリプトで条件ステートメントを使用して、さまざまなシナリオやケースで異なる動作をさせる方法を学習します。

このようにして、はるかに効率的なbashスクリプトを作成でき、スクリプトにエラーチェックを実装することもできます。

bashでifステートメントを使用する

意思決定構造の最も基本的な構成は、if条件です。基本的なifステートメントの一般的な構文は次のとおりです。

if [ condition ]; then
  your code
fi

if ステートメントはfiで閉じられます (ifの逆)

空白に注意してください!

  • 開始ブラケットと終了ブラケットと、書き込む条件の間にはスペースが必要です。そうしないと、シェルはエラーを訴えます。
  • 条件演算子(=、==、<=など)の前後にスペースが必要です。そうしないと、「単項演算子が必要です」などのエラーが表示されます。

それでは、サンプルスクリプトroot.shを作成しましょう。 このスクリプトは、rootユーザーとしてスクリプトを実行した場合にのみ、「youareroot」というステートメントをエコーし​​ます。

#!/bin/bash

if [ $(whoami) = 'root' ]; then
	echo "You are root"
fi

whoami コマンドはユーザー名を出力します。 bash変数のチュートリアルから、$(command) 構文はコマンド置換に使用され、コマンドの出力を提供します。

条件$(whoami) = 'root' rootユーザーとしてログインしている場合にのみtrueになります。

私を信じないの?あなたはする必要はありません。実行して、自分の目で確かめてください。

bashでif-elseステートメントを使用する


root.sh を実行しても、出力が得られないことに気付いたかもしれません。 通常のユーザーとしてのスクリプト。 if条件がfalseと評価されたときに実行するコードは、次のようにelseステートメントに含めることができます。

#!/bin/bash

if [ $(whoami) = 'root' ]; then
	echo "You are root"
else
	echo "You are not root"
fi

これで、通常のユーザーとしてスクリプトを実行すると、全能のrootユーザーではないことが通知されます。

[email protected]:~$ ./root.sh
You are not root

bashでelseifステートメントを使用する

複数の式(条件)を同時にテストする場合はいつでも、elif(else-if)ステートメントを使用できます。

たとえば、次の age.sh bashスクリプトはあなたの年齢を引数として取り、あなたの年齢に対応する意味のあるメッセージを出力します:

#!/bin/bash

AGE=$1

if [ $AGE -lt 13 ]; then
	echo "You are a kid."
elif [ $AGE -lt 20 ]; then
	echo "You are a teenager."
elif [ $AGE -lt 65 ]; then
	echo "You are an adult."
else
	echo "You are an elder."
fi

次に、 age.shを数回実行します。 さまざまな年齢でテストするためのスクリプト:

[email protected]:~$ ./age.sh 11
You are a kid.
[email protected]:~$ ./age.sh 18
You are a teenager.
[email protected]:~$ ./age.sh 44
You are an adult.
[email protected]:~$ ./age.sh 70
You are an elder.

-ltを使用したことに注意してください (未満)$AGE変数を使用したテスト条件。

また、複数のelifを持つことができることに注意してください ステートメントが1つだけelse if構文のステートメントであり、fiで閉じる必要があります 。

bashでネストされたifステートメントを使用する

別のifステートメント内でifステートメントを使用することもできます。たとえば、次の Weather.shを見てください。 bashスクリプト:

#!/bin/bash

TEMP=$1

if [ $TEMP -gt 5 ]; then
	if [ $TEMP -lt 15 ]; then
		echo "The weather is cold."
	elif [ $TEMP -lt 25 ]; then
		echo "The weather is nice."
	else
		echo "The weather is hot."
	fi
else
	echo "It's freezing outside ..."
fi

スクリプトは任意の温度を引数として取り、天気がどのようになるかを反映するメッセージを表示します。温度が5より大きい場合、ネストされた(内部の)if-elifステートメントが評価されます。スクリプトを数回実行して、スクリプトがどのように機能するかを確認しましょう。

[email protected]:~$ ./weather.sh 0
It's freezing outside ...
[email protected]:~$ ./weather.sh 8
The weather is cold.
[email protected]:~$ ./weather.sh 16
The weather is nice.
[email protected]:~$ ./weather.sh 30
The weather is hot.

bashでのCaseステートメントの使用

また、bashでcaseステートメントを使用して、混乱を招き、読みにくい場合があるため、複数のifステートメントを置き換えることもできます。ケース構造の一般的な構文は次のとおりです。

case "variable" in
	"pattern1" )
		Command … ;;
	"pattern2" )
		Command … ;;
	"pattern2" )
		Command … ;;
esac

注意してください!

  • パターンの後には常に空白スペースと)が続きます 。
  • コマンドの後には常にダブルセミコロン;;が続きます 。その前に空白は必須ではありません。
  • ケースステートメントはesacで終わります (ケースの逆)。

ケースステートメントは、パターンマッチングや正規表現を処理する場合に特に役立ちます。実例を示すために、次の char.shを見てください。 bashスクリプト:

#!/bin/bash

CHAR=$1

case $CHAR in
[a-z])
echo "Small Alphabet." ;;
[A-Z])
echo "Big Alphabet." ;;
[0-9])
echo "Number." ;;
*)
echo "Special Character."
esac

スクリプトは引数として1文字を取り、その文字が小さい/大きいアルファベット、数字、または特殊文字のいずれであるかを表示します。

[email protected]:~$ ./char.sh a
Small Alphabet.
[email protected]:~$ ./char.sh Z
Big Alphabet.
[email protected]:~$ ./char.sh 7
Number.
[email protected]:~$ ./char.sh $
Special Character.

ワイルドカードのアスタリスク記号(*)を使用して、if条件のelseステートメントと同等のデフォルトの大文字小文字を定義していることに注意してください。

bashでのテスト条件

ifステートメントで使用できるテスト条件は多数あります。数値、文字列、またはファイルを使用している場合、テスト条件は異なります。それらをbashの論理演算子と考えてください。

以下の表に、最も一般的なテスト条件のいくつかを含めました。

状態 同等
$ a -lt $ b $ a <$ b
$ a -gt $ b $ a> $ b
$ a -le $ b $ a <=$ b
$ a -ge $ b $ a> =$ b
$ a -eq $ b $aは$bと同じです
$ a -ne $ b $aは$bと等しくありません
-e $ FILE $FILEが存在します
-d $ FILE $ FILEが存在し、ディレクトリです。
-f $ FILE $ FILEが存在し、通常のファイルです。
-L $ FILE $ FILEが存在し、ソフトリンクです。
$ STRING1 =$ STRING2 $STRING1は$STRING2と同じです
$ STRING1!=$ STRING2 $STRING1は$STRING2と等しくありません
-z $ STRING1 $STRING1は空です

幸いなことに、テストのマニュアルページで調べることができるため、テスト条件を覚える必要はありません。

[email protected]:~$ man test

filetype.shという名前の最終的なスクリプトを1つ作成しましょう ファイルが通常のファイル、ディレクトリ、またはソフトリンクのいずれであるかを検出します:

#!/bin/bash

if [ $# -ne 1 ]; then
	echo "Error: Invalid number of arguments"
 	exit 1
fi

file=$1

if [ -f $file ]; then
	echo "$file is a regular file."
elif [ -L $file ]; then
	echo "$file is a soft link."
elif [ -d $file ]; then
	echo "$file is a directory."
else
	echo "$file does not exist"
fi

引数の数のチェックを追加することで、スクリプトを少し改善しました。引数がないか、複数の引数がある場合、スクリプトはメッセージを出力し、スクリプト内の残りのステートメントを実行せずに終了します。

スクリプトを数回実行して、さまざまな種類のファイルでテストしてみましょう。

[email protected]:~$ ./filetype.sh weather.sh
weather.sh is a regular file.
[email protected]:~$ ./filetype.sh /bin
/bin is a soft link.
[email protected]:~$ ./filetype.sh /var
/var is a directory.
[email protected]:~$ ./filetype.sh 
Error: Invalid number of arguments

ボーナス:1行にelseステートメントをbashする

これまでのところ、見たすべてのifelseステートメントは適切なbashスクリプトで使用されていました。それはそれを行うためのまともな方法ですが、あなたはそれに義務付けられていません。

シェル自体で結果を確認したいだけの場合は、bashの1行でifelseステートメントを使用できます。

このbashスクリプトがあるとします。

if [ $(whoami) = 'root' ]; then
	echo "You are root"
else
	echo "You are not root"
fi

次のように、すべてのifelseステートメントを1行で使用できます。

if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi

上記をコピーしてターミナルに貼り付け、結果を自分で確認できます。

基本的には、コマンドの後にセミコロンを追加してから、次のif-elseステートメントを追加するだけです。

素晴らしい!これにより、Bashの条件ステートメントをよく理解できるはずです。 bashスクリプトをよりスマートにすることを楽しんでいただけたでしょうか。

以下のPDFでいくつかの簡単なbash演習を練習することで、新しく学んだ知識をテストできます。ソリューションも含まれています。

Bash第7章練習問題この章で学んだことを練習するための問題とその解決策Bash-Chapter-7-Practice-Questions-Linux-Handbook.pdf31KB

bashスクリプトでさまざまなループ構造を使用する方法を学ぶので、来週もお楽しみに。


Linux
  1. Linuxでコンピューターをよりアクセスしやすく持続可能なものにする

  2. RHCE Ansibleシリーズ#6:Ansibleでの意思決定

  3. Bashでのケースステートメントの使用

  1. pushdとpopdを使用してBashシェルをナビゲートする

  2. Bash初心者シリーズ#9:Bashでの関数の使用

  3. Bash初心者シリーズ#8:Bashのループ

  1. Bashでプログラミングする方法:構文とツール

  2. Bashcaseステートメントの構文と例

  3. busybox と bash だけの Linux ディストリビューションですか?