あのぞんブログ

各言語特有っぽい構文: Bash

2025-12-24

この記事は

24 日目の記事です。

個人的な好みを交えて紹介します。

二分探索のサンプルコード

言語の特徴をあえて使い実装している。

#!/bin/bash
# Bash - 配列 + 算術展開 + 条件分岐
binary_search() {
    local -n arr=$1
    local target=$2
    local left=0
    local right=$((${#arr[@]} - 1))

    while ((left <= right)); do
        local mid=$(((left + right) / 2))
        if ((arr[mid] == target)); then
            echo $mid
            return
        elif ((arr[mid] < target)); then
            left=$((mid + 1))
        else
            right=$((mid - 1))
        fi
    done
    echo -1
}

arr=(1 3 5 7 9)
binary_search arr 5  # 2

シェルスクリプトの代表格。今でも現役。

ピックアップ構文

プロセス置換

プロセスの出力をファイルのように扱える<(…)記法。

# <(...) プロセスの出力をファイルとして
diff <(sort file1) <(sort file2)

# >(...) プロセスへの入力として
tee >(grep error > errors.log) >(grep warn > warns.log)

変数展開

変数の値を展開し、デフォルト値や文字列操作ができる。

# 基本
name="world"
echo "Hello, $name"
echo "Hello, ${name}"

# デフォルト値
${var:-default}    # 未定義ならdefault
${var:=default}    # 未定義なら代入も
${var:+value}      # 定義済みならvalue
${var:?error}      # 未定義ならエラー

# 文字列操作
${#var}            # 長さ
${var:0:5}         # 部分文字列
${var#pattern}     # 前方削除(最短)
${var##pattern}    # 前方削除(最長)
${var%pattern}     # 後方削除(最短)
${var/old/new}     # 置換

変数展開は難解な構文だが、多様な文字列加工ができる。

算術展開

$((…))や((…))で算術演算を実行できる。

# ((...)) 算術評価
((x = 5 + 3))
((x++))
((x > 10)) && echo "big"

# $((...)) 算術展開
result=$((5 * 3))
echo $((2 ** 10))  # 1024
echo $((RANDOM % 100))

# let
let "x = x + 1"

連想配列

キーと値のペアを格納できる連想配列(ハッシュ)。

# Bash 4+
declare -A map
map[name]="Alice"
map[age]=30
echo ${map[name]}
echo ${!map[@]}  # キー一覧

© 2026 あのぞんびより