Bashの変数展開
2019/03/08更新
目次
概要
Bashでは、変数名の後に特殊な記述をすることで、その変数に格納した文字列を加工した文字列などを簡単に取得することができる。
一覧
以下が変数展開の一覧である。
記法 | 意味 |
|---|---|
| 「変数」が空ならば「変数」さもなくば「文字列」を返す。 |
| 「変数」が空ならば「文字列」さもなくば「変数」を返す。 |
| 「変数」が空ならば「文字列」を「変数」に代入する。 |
| 「変数」が未定義ならば「文字列」さもなくば「変数」を返す。 |
| 「変数」が未定義ならば「文字列」を「変数」に代入する。 |
| 「変数」が未定義のとき「文字列」をエラーメッセージとして出力する。 |
| 「変数」の「位置」文字目から末尾までを返す。 |
| 「変数」の「位置」文字目から「長さ」文字を返す。 |
| 「変数」の先頭から最短の「パターン」を削除したものを返す。 |
| 「変数」の先頭から最長の「パターン」を削除したものを返す。 |
| 「変数」の末尾から最短の「パターン」を削除したものを返す。 |
| 「変数」の末尾から最長の「パターン」を削除したものを返す。 |
| 「変数」の最初にマッチした「パターン」を「文字列」に置換したものを返す。 |
| 「変数」の先頭でマッチした「パターン」を「文字列」に置換したものを返す。 |
| 「変数」の末尾でマッチした「パターン」を「文字列」に置換したものを返す。 |
| 「変数」の「パターン」にマッチした部分を全て「文字列」に置換したものを返す。 |
| 「変数」の先頭を大文字にしたものを返す。 |
| 「変数」を全て大文字にしたものを返す。 |
| 「変数」の先頭を小文字にしたものを返す。 |
| 「変数」を全て小文字にしたものを返す。 |
| 「変数」の先頭を大文字小文字反転したものを返す。 |
| 「変数」を全て大文字小文字反転したものを返す。 |
| 「変数名」の変数の値の文字数を返す。 |
| 「変数名」の配列の要素数を返す。 |
| 「変数名」の配列の値の一覧を返す。 |
| 「変数名」で始まる変数名の一覧を返す。 |
| 「変数名」の連想配列のキーの一覧を返す。 |
| 「変数名」の連想配列の値の一覧を返す。 |
この中でも、${変数#パターン}、${変数##パターン}、${変数%パターン}、${変数%%パターン}は文字列の切り出しに便利で特によく使われる。#はキーボード上で左にあるので「先頭から」、%はキーボード上で右にあるので「末尾から」、1文字は短いので「最短の」、2文字は長いので「最長の」と覚えるとよい。
使用例
URLやファイルパスなどから、ドメイン名、ディレクトリ、ファイル名、拡張子などを手軽に取り出すのに便利である。
url="http://example.com/path/to/file.txt"
echo $url
# http://example.com/path/to/file.txt
echo ${url#*/}
# /example.com/path/to/file.txt
echo ${url##*/}
# file.txt
echo ${url##*.}
# txt
echo ${url%/*}
# http://example.com/path/to
echo ${url%%/*}
# http:
echo ${url/http/https}
# https://example.com/path/to/file.txt
また、シェルスクリプト内では、$0に対して使用することで、自分自身のファイル名を取り出したり、自分自身の置かれたディレクトリに移動したりすることが簡単にできる。
# /home/foobar/hoge.sh に以下を記述して /home/foobar/hoge.sh と実行した場合
echo $0
# /home/foobar/hoge.sh
# このスクリプトの名前を取得
echo ${0##*/}
# hoge.sh
# このクリプトのあるディレクトリに移動
cd ${0%/*}/
# /home/foobar