shell

シェルの変数展開

More than 1 year has passed since last update.

こちらも blog からの転載。

シェルスクリプトを作成する際にシェル変数に値を代入したり参照したりする事は頻繁に発生するが、 シェル変数の展開にも便利な使い方がある。
basename (1) や dirname (1) と同様な動作がシェルの組込みとして利用できるので資源の節約にもつながり、 上手に利用すると可読性の高いスクリプトが作成できる。

機能一覧

記述 機能
${parameter:-word} デフォルト値への置換
${parameter:=word} デフォルト値の代入
${parameter:?[word]} 値の検査とエラー
${parameter:+word} 代替値の使用
${#parameter} 文字列長の取得
${parameter%word} 最短後置パターンの削除
${parameter%%word} 最長後置パターンの削除
${parameter#word} 最短前置パターンの削除
${parameter##word} 最長前置パターンの削除

実例

デフォルト値への置換

${parameter:-word}

${parameter} が NULL の場合 word に置換される。

sample
$ echo ${foo}

$ echo ${foo:-FOO}
FOO
$ echo ${foo}

$ foo=BAR
$ echo ${foo:-FOO}
BAR

デフォルト値の代入

${parameter:=word}

${parameter} が NULL の場合 word に置換され、 かつ parameter に代入される。

sample
$ echo ${foo}

$ echo ${foo:=FOO}
FOO
$ echo ${foo}
FOO
$ echo ${foo:=BAR}
FOO

値の検査とエラー

${parameter:?[word]}

${parameter} が NULL の場合 word が指定されていればその値を、 指定されていない場合はデフォルトの値を表示し、 非対話実行されているシェルをエラー終了させる。

sample
$ echo ${foo}

$ echo ${foo:?value not set}
value not set

代替値の使用

${parameter:+word}

${parameter} が NULL 以外の場合 word に置換される

sample
$ echo ${foo:+FOO}

$ echo ${foo}

$ foo=BAR
$ echo ${foo}
BAR
$ echo ${foo:+FOO}
FOO

文字列長の取得

${#parameter}

${parameter} の文字列としての長さに置換される

sample
$ echo ${foo}

$ echo ${#foo}
0
$ foo=FOO
$ echo ${foo}
FOO
$ echo ${#foo}
3

最短後置パターンの削除

${parameter%word}

${parameter} の右から word で示されるパターンの最短部分を削除する

sample
$ foo=/foo/bar/baz
$ echo ${foo%/*}
/foo/bar
$ foo=foo.c
$ echo ${foo%.*}
foo
$ foo=foo
$ echo ${foo%.*}
foo

最長後置パターンの削除

${parameter%%word}

${parameter} の右から word で示されるパターンの最長部分を削除する

sample
$ foo=foo.example.com
$ echo ${foo%%.*}
foo
$ foo=http://www.example.com:8888/
$ echo ${foo%%:*}
http
$ foo=foo
$ echo ${foo%%.*}
foo

最短前置パターンの削除

${parameter#word}

${parameter} の左から word で示されるパターンの最短部分を削除する

sample
$ foo=foo.c
$ echo ${foo#*.}
c
$ foo=foo.example.com
$ echo ${foo#*.}
example.com
$ foo=foo
$ echo ${foo#*.}
foo

最長前置パターンの削除

${parameter##word}

${parameter} の左から word で示されるパターンの最長部分を削除する

sample
$ foo=foo.example.com
$ echo ${foo##*.}
com
$ foo=/foo/bar/baz
$ echo ${foo##*/}
baz
$ foo=foo
$ echo ${foo##*.}
foo