数値比較と論理演算
シェルスクリプトにおいて、変数の値を比較したり、複数の条件を組み合わせたりするには、特定の演算子を使用します。これらは主に条件分岐(if文)やループ処理の中で利用されます。
比較演算子
数値の大小や等価性を判定するために、以下の演算子が使用されます。これらは主に[ ](testコマンド)内で利用します。
| 演算子 | 説明 |
|---|---|
| -eq | 2つの数値が等しい場合に真(true)を返す |
| -ne | 2つの数値が等しくない場合に真を返す |
| -gt | 左辺の数値が右辺より大きい場合に真を返す |
| -lt | 左辺の数値が右辺より小さい場合に真を返す |
| -ge | 左辺の数値が右辺以上の場合に真を返す |
| -le | 左辺の数値が右辺以下の場合に真を返す |
実装例:
#!/bin/bash
val_x=40
val_y=25
# 等価性のチェック
if [ $val_x -eq $val_y ]; then
echo "Values are equal"
else
echo "$val_x is not equal to $val_y"
fi
# 大小比較のチェック
if [ $val_x -gt $val_y ]; then
echo "$val_x is greater than $val_y"
fi
# 二重括弧による算術演算式での比較
(( val_x != val_y )) && echo "Values are different" || echo "Values are same"
注意点:
比較演算子の記述に誤りがあると構文エラーが発生します。また、(())構文内ではC言語のような演算子(>, <など)が使用可能ですが、[ ]構文内では\>のようにエスケープ処理が必要になる場合があります。
論理演算子
複数の条件を組み合わせる場合、論理積(AND)や論理和(OR)を使用します。シェルでは記述する場所([ ]内かコマンド列か)によって使用する記号が異なります。
- Boolean演算子([ ] 内で使用):
-a: 論理積(AND)。両方の条件が真のときに真。-o: 論理和(OR)。どちらかの条件が真のときに真。!: 否定(NOT)。条件が偽のときに真。
- 論理演算子(コマンドの連結に使用):
&&: 左辺のコマンドが成功(真)の場合のみ右辺を実行。||: 左辺のコマンドが失敗(偽)の場合のみ右辺を実行。
実装例:
#!/bin/bash
num_a=10
num_b=20
limit=15
# -a (AND) の使用例
if [ $num_a -lt $limit -a $num_b -gt $limit ]; then
echo "Condition 1 met"
fi
# -o (OR) の使用例
if [ $num_a -eq 5 -o $num_b -eq 20 ]; then
echo "Condition 2 met"
fi
# ! (NOT) の使用例
if [ ! $num_a -eq $num_b ]; then
echo "Numbers are not equal"
fi
# && と || の使用例(コマンド制御)
[[ $num_a -gt 5 ]] && [[ $num_b -lt 30 ]] && echo "Both conditions passed via &&"
フロー制御と条件分岐
シェルスクリプトの実行の流れを制御するための主要な構文としてif文があります。条件式の評価結果に基づいて処理を分岐させます。
if文による条件分岐
単一分岐
条件が真の場合のみ処理を実行します。
if [ 条件式 ]; then
実行するコマンド
fi
実装例: メモリ空き容量の監視
システムの空きメモリ量を確認し、閾値を下回っていた場合にログに出力するスクリプトです。
#!/bin/bash
# 空きメモリを取得(MB単位、整数値として切り出し)
available_mem=$(free -m | grep "^Mem:" | awk '{print $7}')
THRESHOLD=1024
if [ $available_mem -lt $THRESHOLD ]; then
# loggerコマンドでシステムログにメッセージを出力
logger -t mem_alert "Warning: Available memory is below ${THRESHOLD}MB (Current: ${available_mem}MB)"
fi
二分岐
条件が真の場合と偽の場合でそれぞれ異なる処理を実行します。
if [ 条件式 ]; then
真の時のコマンド
else
偽の時のコマンド
fi
実装例: 実行ユーザーの権限確認
スクリプトの実行者がrootユーザーかどうかを判定し、それ以外のユーザーの場合は警告を表示して終了します。
#!/bin/bash
# 現在のユーザーID(EUID)を確認
if [ $EUID -ne 0 ]; then
echo "Error: This script must be run as root user."
exit 1
else
echo "Starting system maintenance..."
# ここに管理者権限で実行したい処理を記述
fi
実装例: リポジトリ設定の有無と自動作成
特定の設定ファイルに必要な記述が存在するかを確認し、存在しない場合のみ設定ファイルを作成します。
#!/bin/bash
REPO_FILE="/etc/yum.repos.d/local.repo"
TARGET_BASEURL="file:///mnt/iso"
# 設定ファイルが存在し、特定のbaseurlが含まれているか確認
if grep -q "baseurl=${TARGET_BASEURL}" "${REPO_FILE}" 2>/dev/null; then
echo "Repository is already configured in ${REPO_FILE}."
cat "${REPO_FILE}"
else
echo "Repository not found. Creating configuration..."
cat > "${REPO_FILE}" << EOF
[LocalRepo]
name=Local Installation Repository
baseurl=${TARGET_BASEURL}
enabled=1
gpgcheck=0
EOF
echo "Repository configuration created successfully."
fi