シェル変数まとめ その1
-
${variable:=value}
変数
variable
が空でなければ、variable
の値を返す。 空なら、variable
にvalue
を代入し、value
を返す。 -
${variable=value}
変数
variable
が定義済みなら、variable
の値を返す。 未定義なら、variable
にvalue
を代入し、value
を返す。 -
${variable:-value}
変数
variable
が空でなければ、variable
の値を返す。 空なら、value
を返す。代入処理は行わない。 -
${variable-value}
変数
variable
が定義済みなら、variable
の値を返す。 未定義なら、value
を返す。代入処理は行わない。 -
${variable:?message}
変数
variable
が空でなければ、variable
の値を返す。 空なら、message
を表示し、シェルスクリプト中ならその場で終了する。 -
${variable?value}
変数
variable
が空でなければ、variable
の値を返す。 空なら、message
を表示し、シェルスクリプト中ならその場で終了する。 -
${variable:+value}
変数
variable
が空でなければ、value
を返す。 空なら、空文字列を返す。 -
${variable+value}
変数
variable
が定義済みなら、value
を返す。 未定義なら、空文字列を返す。
:
(コロン)ありの場合は変数が空でないかどうかで判定するのに対し、:
(コロン)なしの場合は定義済かどうかで判定します。
例
$ FOO= # 空にする
$ echo ${FOO:=123} # 空なので
123 # 123 を返す
$ echo $FOO
123 # 代入もされてる
$ echo ${FOO:=456} # 今度は空ではないので
123 # FOOの値 (123)を返す
$ FOO= # 空にする
$ echo ${FOO=456} # 空ですが、定義はされてるので
# FOO の値 (NULL) を返す
$ echo $FOO
# 代入もされていない
$ unset FOO # 未定義に戻すには unset します
$ echo ${FOO=456} # 未定義なので
456 # 456 を返す
$
=
と -
の違いは、 -
は代入まではしないことです。
$ FOO= # 空にする
$ echo ${FOO:-123} # 空なので
123 # 123 を返す
$ echo $FOO # ただし代入はされてない
$
+
は -
とは反対のような機能ですね。
$ FOO= # 空にする
$ echo ${FOO:+123} # 空なので
# 空を返す
$ FOO=456 # 何か値を入れる
$ echo ${FOO:+123} # 空ではないので
123 # 123 を返す
$ echo $FOO
456 # 代入はされません
あと、こんなんもあります。
-
${variable#value}
variable
の値の前からvalue
を削ったものを返す。最短のマッチ。 -
${variable##value}
variable
の値の前からvalue
を削ったものを返す。最長のマッチ。 -
${variable%value}
variable
の値の後ろからvalue
を削ったものを返す。最短のマッチ。 -
${variable%%value}
variable
の値の後ろからvalue
を削ったものを返す。最長のマッチ。
例)
$ FOO=foo/bar/baz
$ echo ${FOO#foo/} # 前方の foo/ を削ります。
bar/baz
$ echo ${FOO#*/} # ワイルドカードも使えます。前方の */ を削ります。(最短のマッチ)
bar/baz
$ echo ${FOO##*/} # 前方の */ を削ります。(最長のマッチ)
baz
$ echo ${FOO%/*} # 後方の /* を削ります。(最短のマッチ)
foo/bar
$ echo ${FOO%%/*} # 後方の /* を削ります。(最長のマッチ)
foo
$ echo ${FOO#foobar} # マッチしない場合はそのまま
foo/bar/baz
パスのディレクトリ部分やファイル名部分を取り出すときに、 dirname
コマンドや basename
コマンド
を使わなくても、${FOO%/*}
と ${FOO##*/}
で代用できるということですね。
ここから先は、bash でしか使えない書き方です。
これらをスクリプトで使うときは、shebang を #!/bin/bash
にすること。
-
${variable^}
variable
の値の 1文字目を大文字に変換する。 -
${variable^^}
variable
の値の 全文字を大文字に変換する。 -
${variable,}
variable
の値の 1文字目を小文字に変換する。 -
${variable,,}
variable
の値の 全文字を小文字に変換する。 -
${variable~}
variable
の値の 1文字目を大文字小文字反転。 -
${variable~~}
variable
の値の 全文字を大文字小文字反転。 -
${variable/before/after/}
variable
の値で、before
にマッチした文字列をafter
に置換する。(最初にマッチしたもののみ)
echo $variable | sed s/before/after/
の動作。 -
${variable//before/after/}
variable
の値で、before
にマッチした文字列をafter
に置換する。(マッチしたものすべて置換)
echo $variable | sed s/before/after/g
の動作。
blog comments powered by Disqus