UNIX/Linuxのシェルの1つであるshやbashでは先頭に$を付加した{ }で括られたパラメータを展開する際の挙動として、あらゆる設定方法があります。
パラメータ | 意味 |
---|---|
${parameter} | パラメータ展開の基本形 |
${parameter:-word} | parameterが設定されていない、またはnullの場合、 wordとして置き換えられ展開されるか、さもなければparameterの値として置き換えられる |
${parameter:=word} | parameterが設定されていない、またはnullの場合、 parameterに割り当てられwordとして展開され、その際にparameterの値が置き換えられる パラメータと特殊パラメータの配置については、この方法では割り当てられない場合がある |
${parameter:?word} | parameterが設定されていない、またはnullの場合、 スクリプトのように対話的でない場合や存在しない場合、標準エラーとシェルに書かれるword(またはwordが表示されない場合に有効となるmessage)として展開されるか、さもなければparameterの値として置き換えられる |
${parameter:+word} | parameterが設定されていない、null、またはカラの場合は、wordに置き換えられるか、さもなければ置き換えられた後wordとして展開される |
${parameter:offset} ${parameter:offset:length} |
offsetに書かれた文字で始まるparameter内の文字からlength文字分まで展開
lengthが省略された場合、offsetに書かれた文字で始まるparameterの部分文字列を展開 lengthとoffsetは算術式であり、これは置換拡張である lengthは、ゼロ以上の数値として評価されなければならない offsetがゼロより小さい値を評価した場合、その値はparameterの値の後ろからoffsetとして利用される parameterが配列(@)だったら、その結果はoffsetで始まるパラメータの位置がlength parameterが索引付けされた配列(@)か*だったら、その結果は${parameter[offset]}で始まる配列のメンバの位置 内部的なoffsetは、配列に書かれた最大インデクスより大きいものと相関して取得される ちなみに内部的なoffsetは、[:-]拡張との誤認を回避する為に少なくとも1つのスペースによってコロンから離れていないければならない 位置的なパラメータは明示的に1で始まるインデックス付けがなされるようなことがない限り、置換インデックスはゼロ基準 |
${!prefix*} ${!prefix@} | 特殊変数IFSの最初の文字によって分割したprefixで始まる名前を持つ変数の名前として展開 |
${!name[@]} ${!name[*]} |
nameが配列変数の場合、nameに紐づけられた配列インデックス(キー)のリストとして展開
nameが配列変数でない、nameがセットされているかnullのような場合、0として展開 @が使われダブルクォート内に現れた場合には、各キーは単語に分割されて展開 |
${#parameter} |
置換されるparameterの値を展開した文字の長さ
parameterが*や@の場合、置換した値はパラメータ位置の数字 parameterが*や@にある配列名の場合、置換した値は、配列内の要素番号 |
${parameter#word} ${parameter##word} |
wordは、ちょうどファイル名展開のようにパターンを生成する為に展開される
パターンマッチが展開したparameterの値で始まっている場合、展開の結果は最短マッチ(#)か最長マッチ(##)を削除したparameterの値を展開 parameterが*や@の場合、パターンを取り除くその操作は、各parameterの配置ごとに変わり、展開されるのはその結果となる一覧 parameterが*や@を伴った配列変数である場合、パターンを取り除くその操作は、配列の各要素によって変わり、展開されるのはその結果となる一覧 |
${parameter%word} ${parameter%%word} |
wordは、ちょうどファイル名展開のようにパターンを生成する為に展開される
パターンマッチが展開したparameterの値の一部に続く場合、展開の結果は最短マッチ(%)か最長マッチ(%%)を削除したparameterの値を展開 parameterが*や@の場合、パターンを取り除くその操作は、各parameterの配置ごとに変わり、展開されるのはその結果となる一覧 parameterが*や@を伴った配列変数である場合、パターンを取り除くその操作は、配列の各要素によって変わり、展開されるのはその結果となる一覧 |
${parameter/pattern/string} |
patternは、ちょうどファイル名展開のようにパターンを生成する為に展開される
展開されるparameterとその値に対するpatternの最長マッチが、stringで置換される patternがスラッシュを伴って始まる場合、patternの全てのマッチはstringで置換される 通常は、最初にマッチしたものだけが置換される patternが#で始まる場合、展開したparameterの値の先頭とマッチしなければならない patternが%で始まる場合、展開したparameterの値の末尾とマッチしなければならない stringがnullの場合、patternのマッチは削除され、patternに続くスラッシュは省略される場合がある parameterが*や@の場合、その置換操作は、各parameterの配置ごとに変わり、展開されるのはその結果となる一覧 parameterが*や@を伴った配列変数である場合、その置換操作は、配列の各要素によって変わり、展開されるのはその結果となる一覧 |
${parameter^pattern} ${parameter^^pattern} ${parameter,pattern} ${parameter,,pattern} |
この展開は、parameter内のアルファベット文字を部分修正
patternは、ちょうどファイル名展開のようにパターンを生成する為に展開される (1つのキャレット)^演算子は大文字のパターンとマッチする文字を小文字に変換 (1つのカンマ),演算子は小文字を大文字に変換 (2つのキャレット)^^(2つのカンマ),,は、それぞれ(1つのキャレット)^演算子、(1つのカンマ),演算子と同様だが、展開された値の最初の文字だけを変換する点で異なる patternが省略された場合、文字ごとにマッチする?のように扱われる parameterが*や@の場合、その部分修正操作は、各parameterの配置ごとに変わり、展開されるのはその結果となる一覧 parameterが*や@を伴った配列変数である場合、その部分修正操作は、配列の各要素によって変わり、展開されるのはその結果となる一覧 |
以上、流れ的にinfo bashや最後のパターンは下記GNUマニュアル(bash version 4.1)のパラメータの項を訳してみたわけですが、日本語がなんか変。。。なのは内緒!?というわけで正確には原文をご参照ください。
参照:http://www.gnu.org/software/bash/manual/html_node/
参照:http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html