言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理に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}』で変数が未定義または空のときにデフォルト値を使います。

default.sh
name=""
echo "${name:-ゲスト}"
bash default.sh
ゲスト

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

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

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

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

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

file="document.txt"
echo "${file%.*}"
document

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

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

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

replace.sh
text="Hello World World"
echo "${text/World/Bash}"
echo "${text//World/Bash}"
bash replace.sh
Hello Bash World
Hello Bash Bash

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

substring.sh
str="Hello, Bash!"
echo "${str:7:4}"
bash substring.sh
Bash

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

case_convert.sh
lower="hello"
echo "${lower^^}"
upper="WORLD"
echo "${upper,,}"
bash case_convert.sh
HELLO
world

概要

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

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

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

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