- GIDEON
- GIDEON STAFF BLOG
2009/04/09
POSIX.2 標準仕様のシェルによる変数展開
シェルスクリプトを作成する際に
シェル変数に値を代入したり参照したりする事は頻繁に発生するが、
シェル変数の展開にも便利な使い方がある。
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 に置換される。
$ echo ${foo} $ echo ${foo:-FOO} FOO $ echo ${foo} $ foo=BAR $ echo ${foo:-FOO} BAR
デフォルト値の代入
- ${parameter:=word}
${parameter} が NULL の場合 word に置換され、 かつ parameter に代入される。
$ echo ${foo} $ echo ${foo:=FOO} FOO $ echo ${foo} FOO $ echo ${foo:=BAR} FOO
値の検査とエラー
- ${parameter:?[word]}
${parameter} が NULL の場合 word が指定されていればその値を、 指定されていない場合はデフォルトの値を表示し、 非対話実行されているシェルをエラー終了させる。
$ echo ${foo} $ echo ${foo:?value not set} value not set
代替値の使用
- ${parameter:+word}
${parameter} が NULL 以外の場合 word に置換される
$ echo ${foo:+FOO} $ echo ${foo} $ foo=BAR $ echo ${foo:-FOO} FOO $ echo ${foo} BAR
文字列長の取得
- ${#parameter}
${parameter} の文字列としての長さに置換される
$ echo ${foo} $ echo ${#foo} 0 $ foo=FOO $ echo ${foo} FOO $ echo ${#foo} 3
最短後置パターンの削除
- ${parameter%word}
${parameter} の右から word で示されるパターンの最短部分を削除する
$ bar=/foo/bar/baz $ echo ${foo%/*} /foo/bar $ foo=foo.c $ echo ${foo%.*} foo $ foo=foo $ echo ${foo%.*} foo
最長後置パターンの削除
- ${parameter%%word}
${parameter} の右から word で示されるパターンの最長部分を削除する
$ 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 で示されるパターンの最短部分を削除する
$ foo=foo.c $ echo ${foo#*.} c $ foo=foo.example.com $ echo ${foo#*.} example.com $ foo=foo $ echo ${foo#*.} foo
最長前置パターンの削除
- ${parameter##word}
${parameter} の左から word で示されるパターンの最長部分を削除する
$ foo=foo.example.com $ echo ${foo##*.} com $ foo=/foo/bar/baz $ echo ${foo##*/} baz $ foo=foo $ echo ${foo##*.} foo