はじめに
シェルスクリプトで文字列操作を行う際、sed や awk といった外部コマンドを多用するケースがあると思います。
単純な置換や切り出しであれば、シェルの標準機能である パラメータ展開 (Parameter Expansion) を使用する方が効率的です。
今回は、BashやZshなど多くのシェルで共通して使える、便利な文字列操作テクニックについて解説します。
1. 基本的な文字列操作
文字列の切り出し (Substring)
変数の特定の位置から文字を取り出すことができます。
str="The quick brown fox jumps over the lazy dog"
# 10文字目から5文字切り出す
echo "${str:10:5}"
# -> brown
# 後ろから4文字切り出す (スペースが必要、または括弧で囲む)
echo "${str: -4}"
# -> dog
文字列置換 (Replacement)
変数の内容をパターンマッチで置換することができます。
path="/home/user/project/src/main.c"
# 最初に見つかった "user" を "admin" に置換
echo "${path/user/admin}"
# -> /home/admin/project/src/main.c
# 全ての "/" を "_" に置換 (グローバル置換)
echo "${path//\//_}"
# -> _home_user_project_src_main.c
# 行頭の "/" のみ削除
echo "${path/#\//}"
# -> home/user/project/src/main.c
# 行末の ".c" を ".o" に置換
echo "${path/%.c/.o}"
# -> /home/user/project/src/main.o
これらは全てシェル内部で処理されるため、外部コマンドを呼び出すよりも高速に動作します。
2. デフォルト値とエラーハンドリング
変数が未定義(または空)の場合の挙動を制御する機能は、堅牢なスクリプトを書く上で非常に重要です。
デフォルト値の使用 :-
変数が未定義または空の場合に、指定したデフォルト値を使用します。
# NAME が設定されていなければ "Guest" を表示
echo "Hello, ${NAME:-Guest}"
デフォルト値の代入 :=
変数が未定義または空の場合に、デフォルト値をその変数に代入します。
# CONFIG_PATH が未定義なら "/etc/config" を代入して使用
file_path="${CONFIG_PATH:=/etc/config}"
エラー終了 :?
変数が未定義または空の場合に、エラーメッセージを表示してスクリプトを終了させます。
必須変数のチェックに便利です。
# TARGET_DIR が未定義ならエラー終了
: "${TARGET_DIR:?Error: Target directory is not set}"
3. 配列操作
配列の扱いはシェルによって多少異なりますが、基本的なインデックス配列は以下のように扱えます。
# 配列の宣言
fruits=("apple" "banana" "cherry")
# 要素へのアクセス (Bash/Zsh共通)
echo "${fruits[1]}"
# -> banana (※Zshはデフォルトで1始まりですが、Bash互換モードや設定によります。Bashは0始まりです)
# 全要素の表示
echo "${fruits[@]}"
# -> apple banana cherry
ZshとBashでは配列のインデックス番号の開始位置(0か1か)が異なる場合があります。
移植性を考慮する場合は、配列のインデックスに依存しない書き方(for item in "${array[@]}" など)の方がいいようです。
次回
次回は 「プロセス制御とシグナルハンドリング」 について解説します。