この記事では、Bashシェルスクリプトの基本について説明し、単一の ifを含む最も広く使用されている論理構造について説明します。 ステートメント、 if-else ステートメント、および elif 声明。これに加えて、文字列と数値を比較する正しい方法についても説明します。 Linuxシェルエクスペリエンスを5分で改善してください!
経験豊富なシステム管理者またはLinuxの初心者ユーザーであれば、シェルスクリプトの基礎を知っておく価値があります。このスキルにより、単一または複数のサーバー間で繰り返し可能なタスクを自動化することができます。通常、これらのタスクには、ソフトウェアのインストールとシステムサービスの構成が含まれます。
Ifステートメント
if ステートメントは、すべてのプログラミング言語の基本的なコアとして機能します。このステートメントは、プログラムまたはスクリプト内に意思決定ロジックを実装するのに役立ちます。そのため、さまざまな ifの使用方法を理解することが重要です。 ステートメント。
基本的な構文は次のとおりです。
if [ condition ]
then
COMMANDS
fi
場所:
- 状態 –は ifの論理演算子です ステートメント。
- コマンド –条件が真のときに実行されるコマンド 。
- if、then、fi –は構文キーワードです。

最もよく使用されるテスト条件演算子のリストは次のとおりです。
オペレーター | 説明 |
---|---|
!表現 | 式は誤りです。 |
-n文字列 | STRINGの長さがゼロより大きい。テキスト |
-z文字列 | STRINGの長さはゼロです(STRINGは空です) |
STRING1 =STRING2 | STRING1はSTRING2と同じです |
STRING1!=STRING2 | STRING1はSTRING2と等しくありません |
INTEGER1 -eq INTEGER2 | INTEGER1は数値的にINTEGER2と同じです |
INTEGER1 -gt INTEGER2 | INTEGER1はINTEGER2よりも数値的に大きい |
INTEGER1 -lt INTEGER2 | INTEGER1は数値的にINTEGER2よりも小さい |
-eファイル | ファイルが存在します |
-dファイル | FILEが存在し、ディレクトリです |
-sファイル | FILEが存在し、そのサイズがゼロより大きい(FILEは空ではありません。 |
-wファイル | FILEが存在し、書き込み権限が付与されています。 |
-xファイル | FILEが存在し、実行権限が付与されています。 |
-rファイル | FILEが存在し、読み取り権限が付与されています。 |
最も興味深いのは、Bashスクリプトの実行中に、 []のすべてが テストに合格します ユーティリティ。trueのいずれかを返します またはfalse 。したがって、演算子の構文を忘れた場合は、そのマニュアルページを使用してください:
man test

最も単純なifを見てみましょう ステートメントの例:
#!/bin/bash
var=2
if [ $var -eq 2 ]
then
echo "var equals 2"
fi
期待される出力:
var equals 2

上記の例では、変数 varを設定しています。 2の値 、次に、 var 値が等しい( -eq ) 2 メッセージを印刷しました。
実生活では、通常、 ifを使用しています Bashループ構造(forループ、whileループ、untilループ)と組み合わせたステートメント。 ifの使用例を次に示します。 forを含むステートメント -ループ:
#!/bin/bash
for var in 1 2 3 4 5
do
if [ $var -eq 3 ]
then
echo "Value 3 found"
break
fi
echo var=$var
done
期待される出力:
var=1
var=2
Value 3 found

この例では、 1の番号のリストを確認しています。 〜 5 for -ループして、処理したばかりの変数の値を出力します。値3が見つかると、スクリプトの実行が中断されます。
上記の例に加えて、 ifで数学計算の結果を使用できます。 ステートメント:
#!/bin/bash
for var in {1..10}
do
if (( $var % 2 == 0 ))
then
echo "$var is even number"
fi
done
上記の例では、 1の範囲の偶数をチェックしています。 および10 。
期待される出力:
2 is even number
4 is even number
6 is even number
8 is even number
10 is even number

これで、Bashコマンドの出力または実行結果を確認できます。ユーザーが/etc / passwdに存在することを確認してみましょう ファイル。
#!/bin/bash
user='root'
check_result=$( grep -ic "^$user" /etc/passwd )
if [ $check_result -eq 1 ]
then
echo "$user user found"
fi
上記の例では、 grepを使用しています / etc / passwdを検索するコマンド ファイル:
grep -ic "^$user" /etc/passwd
場所:
- -i –大文字と小文字を区別しない検索。
- -c –見つかった行数を返します(0 –何も見つかりませんでした。何かが見つかった場合は1以上)。
- 「^$user」 –開始する文字列を検索します( ^ ) $ userの値から 変数。
例内の他のすべては明確である必要があります。
期待される出力:
root user found
次に、 / etc / passwdであることを確認しましょう。 ファイルが存在します:
#!/bin/bash
file='/etc/passwd'
if [ -s $file ]
then
echo "$file file found"
fi
期待される出力:
/etc/passwd file found

If-elseステートメント
基本的なifに慣れた後 ステートメント、Bashの使用方法を見てみましょう if-else ステートメント。
一般的な構文は次のとおりです。
if [ condition ]
then
TRUE_COMMANDS
else
FALSE_COMMANDS
fi
場所:
- 状態 –は ifの論理演算子です ステートメント。
- TRUE_COMMANDS –条件が真の場合に実行されるコマンド。
- FALSE_COMMANDS –条件がfalseの場合に実行されるコマンド。
- if、then、else、fi –は構文キーワードです。

それがどのように機能するかを示すために、偶数を検出した1つの例を変更してみましょう。それでは、どの数が偶数でどれが奇数かを印刷してみましょう:
#!/bin/bash
for var in {1..10}
do
if (( $var % 2 == 0 ))
then
echo "$var is even number"
else
echo "$var is odd number"
fi
done
期待される出力は次のとおりです:
1 is odd number
2 is even number
3 is odd number
4 is even number
5 is odd number
6 is even number
7 is odd number
8 is even number
9 is odd number
10 is even number

Elifステートメント
では、スクリプトの実行中にいくつかの異なる条件をチェックする必要がある場合はどうなるでしょうか。これは、「 else if」のショートカットであるelifステートメントを使用して行うこともできます。 」。
構文は次のようになります。
if [ condition_1 ]
then
CONDITION_1_COMMANDS
elif [ condition_2 ]
then
CONDITION_2_COMMANDS
else
ALL_OTHER_COMMANDS
fi
場所:
- condition_1 –は、 CONDITION_1_COMMANDSを実行するための論理条件です。 。
- CONDITION_1_COMMANDS – condition_1の場合に実行されるコマンド 本当 。
- CONDITION_2_COMMANDS – condition_2の場合に実行されるコマンド 本当 。
- ALL_OTHER_COMMANDS – condition_1のときに実行されるコマンド およびcondition_2 false 。
- if、then、elif、else、fi –は構文キーワードです。

次の例を見てみましょう。
#/bin/bash
time=8
if [ $time -lt 10 ]
then
echo "Good morning"
elif [ $time -lt 20 ]
then
echo "Good day"
else
echo "Good evening"
fi
この例では、時間を設定します 8に可変 AMで、時間の値に基づいてメッセージを出力しました。
期待される出力:
Good morning


これで、基本に慣れたら、ifステートメントをネストする方法を学習してこのトピックを終了できます。
次に例を示します:
#/bin/bash
value=5
if [ $value -lt 10 ]
then
if [ $value -eq 5 ]
then
echo "Value equals 5"
else
echo "Value not equals 5"
fi
else
echo "value is greater than 10"
fi
期待される出力は次のとおりです:
Value equals 5


1回の場合で複数の条件を確認すると便利な場合があります 声明。次のブール演算子を使用してこれを行うことができます:
- && –論理積。
- || –論理OR。
簡単な例を次に示します。
#!/bin/bash
username="andrei"
birthday="12/16"
today=$( date +"%m/%d")
if [ $USER = $username ] && [ $today = $birthday ]
then
echo "Happy birthday\!"
fi
この簡単な例では、2つの条件が真であるかどうかを確認しています。
- ログインしているユーザーのユーザー名はandreiと同じである必要があります。
- 今日の日付は12月16日です。
両方の条件が当てはまる場合は、「お誕生日おめでとう!」と印刷しています。
状況によっては、スクリプトをチェックインするために3つ以上のelifステートメントが必要になる場合があります。この場合、elifステートメントの使用は複雑になります。 Bashは、ケースを使用して、このような状況をより適切に処理する方法を提供します。 ステートメント。
構文は次のとおりです。
case VARIABLE in
VALUE_1)
COMMANDS_FOR_VALUE_1
;;
VALUE_2)
COMMANDS_FOR_VALUE_2
;;
*)
DEFAULT_COMMANDS
;;
esac
場所:
- 可変 –値が VALUE_1と比較される変数 またはVALUE_2 。
- COMMANDS_FOR_VALUE_1 – VARIABLEのときに実行するコマンド 値はVALUE_1と同じです 。
- COMMANDS_FOR_VALUE_2 – VARIABLEのときに実行するコマンド 値はVALUE_2と同じです 。
- DEFAULT_COMMANDS – VARIABLEのときに実行するコマンド 値が上位条件の1つと等しくありませんでした。
- ケース 、 in 、 esac –構文キーワード。

これは、スクリプトへの入力を処理し、ユーザーに基づいてサービスを開始、停止、または再起動するための非常に一般的なパターンです。入力:
#!/bin/bash
case $1 in
start)
echo "Starting the service"
;;
stop)
echo "Stopping the service"
;;
restart)
echo "Restarting the service"
;;
*)
echo "Unknown action"
;;
esac
この例では、特別な $ 1の値を確認しています。 Bash変数。スクリプトに提供される最初の引数が含まれています。たとえば、上記の例をファイル service.shに保存する場合 次のように実行します:
bash service.sh start
$ 1 値として「start」という単語が含まれます。
残りはcaseステートメントロジックによって処理されます。
この記事では、Bashシェルスクリプトの基礎を取り上げ、単一の ifを含む最も広く使用されている論理構造について説明しました。 ステートメント、 if-else ステートメント、および elif ステートメント。
この記事がお役に立てば幸いです。もしそうなら、どうぞ、私たちがそれを世界に広めるのを手伝ってください!