実践編:制御構文と条件分岐・繰り返し
終了ステータスに基づく条件判定、if や switch による分岐処理、for や while ループ、および math コマンドによる数値計算を解説します。
条件判定の基本思想
fish の制御構文では、条件式として直接「コマンド」を指定します。そのコマンドの終了ステータス($status)が 0(成功)であれば真、0 以外(失敗)であれば偽 と判定されます。
値の比較やファイルの存在確認を行うには、標準の組み込みコマンド test を使用します。
# ファイルが存在するか判定
if test -f ./config.yaml
echo "Config file exists."
end
test コマンドは角括弧 [ ... ] と同等ですが、fish では可読性の観点から test コマンドの明示的な記述が推奨されます。
条件分岐(if と switch)
直感的なブロック構文による分岐処理です。
» if / else if / else / end
Bash のような then や fi は不要で、すべて end でブロックを閉じます。
set -l response_code 200
if test $response_code -eq 200
echo "Success: OK"
else if test $response_code -eq 404
echo "Warning: Not Found"
else
echo "Unknown status code: $response_code"
end
» switch / case / end
文字列の一致やワイルドカードによるパターン分類には switch を使用します。
set -l target_env "staging"
switch $target_env
case "prod*"
echo "Danger: Production environment!"
case "stage" "staging"
echo "Info: Staging environment."
case "*"
echo "Info: Development or local environment."
end
繰り返し構文(for と while)
リストの走査や反復処理を行うループ構文です。
» for ループ
リストの各要素を順番に取り出して処理します。
set -l servers web01 web02 db01
for s in $servers
echo "Checking health of $s..."
end
# 連番の生成には seq コマンドを使用
for i in (seq 1 5)
echo "Step: $i"
end
» while ループ
指定したコマンドが成功(ステータス 0)を返し続ける間、処理を反復します。
# 外部コマンドから1行ずつ読み込んで処理
while read -l line
echo "Processing line: $line"
end < access.log
ループ内では break(ループの中断)や continue(次の反復へスキップ)が使用可能です。
算術計算(math コマンド)
fish は専用の算術展開記号(Bash の $(( ... )) 等)を持たず、組み込みの math コマンドを使用します。
math コマンドは整数の四則演算だけでなく、浮動小数点数(小数)の計算や数学関数の呼び出しにも標準で対応しています。
# 整数の計算
set total (math 10 + 20 \* 3)
echo "Total: $total"
# 小数の計算と四捨五入
set result (math "3.14159 * 2.5")
echo "Result: $result"
# べき乗や関数
math "sqrt(144)"
# 出力結果: 12