Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. Bash辞典
  3. ${パラメータ展開}

${パラメータ展開}

パラメータ展開(『${変数名...}』)は変数の値を参照するだけでなく、デフォルト値の設定・部分文字列の抽出・置換など高度な操作ができます。外部コマンドを呼ばずに文字列処理ができるため高速です。

構文
# 基本参照
${var}

# 変数が未定義または空のときにデフォルト値を使う
${var:-default}

# 変数が未定義または空のときにデフォルト値を代入する
${var:=default}

# 変数が未定義または空のときにエラーメッセージを出して終了する
${var:?エラーメッセージ}

# 変数が設定されているときだけ代替値を返す
${var:+代替値}

# 文字列の長さ
${#var}

# 前方一致で最短削除 / 最長削除
${var#パターン}
${var##パターン}

# 後方一致で最短削除 / 最長削除
${var%パターン}
${var%%パターン}

# 文字列置換(最初の1つ / 全部)
${var/old/new}
${var//old/new}

# 部分文字列の取り出し(オフセット:長さ)
${var:offset:length}
展開一覧
展開概要
${var:-default}var が未定義か空なら default を返します(var は変更されません)。
${var:=default}var が未定義か空なら default を代入して返します。
${var:?msg}var が未定義か空ならエラーメッセージを出力してスクリプトを終了します。
${var:+alt}var が設定済みなら alt を返します。未設定なら空文字列を返します。
${#var}変数の文字列長を返します。
${var#pat}前方から pat に最短一致する部分を削除します。
${var##pat}前方から pat に最長一致する部分を削除します。
${var%pat}後方から pat に最短一致する部分を削除します。
${var%%pat}後方から pat に最長一致する部分を削除します。
${var/old/new}最初に一致した old を new に置換します。
${var//old/new}一致した old をすべて new に置換します。
${var:offset:len}offset 文字目から len 文字分を取り出します。
${var^^} / ${var,,}すべて大文字 / 小文字に変換します(Bash 4以降)。
サンプルコード

『${var:-default}』で変数が未定義または空のときにデフォルト値を使います。

name=""
echo "${name:-ゲスト}"
ゲスト

『${var:=default}』は代入しながらデフォルト値を設定します。

: ${config:=/etc/myapp.conf}
echo "$config"
/etc/myapp.conf

『${#var}』で文字列の長さを取得します。

file="document.txt"
echo "${#file}"
12

『${var%.*}』で拡張子を削除します(後方最短一致)。

echo "${file%.*}"
document

『${var##*/}』でディレクトリ部分を削除します(前方最長一致)。『basename』の代替として使えます。

path="/usr/local/bin/bash"
echo "${path##*/}"
echo "${path%/*}"
bash
/usr/local/bin

『${var/old/new}』で最初に一致した文字列を置換します。『//』で全部置換します。

text="Hello World World"
echo "${text/World/Bash}"
echo "${text//World/Bash}"
Hello Bash World
Hello Bash Bash

『${var:offset:length}』で部分文字列を取り出します。

str="Hello, Bash!"
echo "${str:7:4}"
Bash

『${var^^}』で大文字、『${var,,}』で小文字に変換します(Bash 4以降)。

lower="hello"
echo "${lower^^}"
upper="WORLD"
echo "${upper,,}"
HELLO
world
概要

パラメータ展開はシェルの組み込み機能なのでサブプロセスを起動しません。ファイルパスの操作(拡張子削除・ディレクトリ取得)を sed や awk を呼ばずに実現できるため、ループ内での処理が高速になります。

:- と - の違い:コロンありは「未定義または空」、コロンなしは「未定義のみ」が対象になります。通常は空文字列もデフォルト値に置き換えたいので『:-』を使います。

変数の基本的な定義・参照は 変数の定義と参照 を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。