Help us understand the problem. What is going on with this article?

シェルの変数展開

More than 5 years have 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

bsdhack
親バカがviでシェルスクリプトを書いてる様なヤツです。 古き良きUNIXが好きですが最近は Mac ばかり使ってます。 Unix/Linux 技術者をお捜しの方は是非声をかけて下さい
http://blog.bsdhack.org
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした