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スクリプトでさまざまなループ構造を使用する方法を学ぶので、来週もお楽しみに。