変数展開
記述 | 説明 | 例 |
${parameter} | parameter値に置換される。 |
|
${parameter:-word} | parameterがunsetまたはnullの時、wordに置換される。 |
|
${parameter:+word} | parameterがunsetまたはnullの時、置換されず、そうでなければparameterの値に置換される。 |
|
${parameter:=word} | parameterがunsetまたはnullの時、wordの値がparameterに代入される。 |
|
${parameter:?word} | parameterがnullまたはunsetの時、wordの値が 標準エラー出力とshellに出力される。インタラク ティブでないshellは終了する。そうでければ、parameterの値に置換される。 |
|
${parameter:offset} ${parameter:offset:length} |
parameter文字列をoffsetからlength数までの 部分文字列を返す。 |
|
${!prefix*} ${!prefix@} |
名前がprefixで始まる変数名を展開する。区切り 文字はIFSの値が使われる。 |
|
${!name[@]} ${!name[*]} |
nameが配列の場合、keyのリストに展開される。 nameが配列でない場合、nameがsetされていれば 0、でなければnullに展開される。 |
|
${#parameter} | parameterの文字列長。 |
|
${parameter#word} ${parameter##word} |
パス名の前方一致によるパターン展開。#は、 shortest maching、##は、longest maching。 |
|
${parameter%word} ${parameter%%word} |
パス名の後方一致によるパターン展開。%は、 shortest maching、%%は、longest maching。 |
|
${parameter/pattern/string} | パラメータ置換。 |
|
フロー制御
ループ構造
until
条件が真になるまで繰り返し実行される。
while
条件が真の間繰り返し実行される。
以下では、server.txtから1行ずつ読み込み、文字列に”web”が含まれている場合に出力する。
for
馴染みのあるfor文。他の高級言語の構文と同様に書ける。
拡張for文、foreach文のようにも書ける。
条件構造
if
基本的な条件分岐。elsif
でもなく、else if
でもなく、elif
に注意。
case
他の高級言語でいうとswitch文に当たる。比較部分は、(.+)
と(
で囲っても良い。以下は、起動時に渡された引数をParseするシンプルな例。
最新のbashではコマンドの区切り文字に、;;
、;&
、;;&
が用意されておりそれぞれ解釈が異なるので注意。;;
は、command-listの実行を終え次の句の評価へ移る。;&
は、fall throughの動きになる。;;&
は、引き続き後続するwordのマッチを試みる。実際の動きは以下のようになる。
select
シンプルな選択リストを表示して標準入力から値を受け取ることができる。
in words
が省略されている場合は、$@
が指定されたかのように振る舞う。
((..))、$((..))
算術式。let
と等しい。statusは、式の評価の結果が0
の場合は1
を、そうでない場合は0
を返す。
[[..]]
拡張正規表現やPattern Matchingによる条件評価が可能。
[..], test
条件の評価を行なう。
グルーピングコマンド
コマンドをグループ化して実行できる。
( list )
サブシェルで実行される。以下の例では、サブシェルでカレントディレクトリを一時的に変更し、また元のカレントディレクトリで後続の処理を実行している。サブシェルで定義した変数は、元のコンテキストでは無効となっている。
{ list; }
現在のシェルのコンテキストで評価される。リストのコマンド実行前後でカレントディレクトリは変更されている。
また、以下のようにリダイレクトと組み合わせるとログファイルへの出力などを一箇所にまとめることができる。
Coprocesses
サブシェルで非同期に実行する仕組み。サブシェルとはcoproc実行時に生成されるファイルディスクリプタを経由してやりとりすることができる。
NAME
は、commandのPIDやファイルディスクリプタを参照するための変数に使われる識別名。指定しない場合は、デフォルトでCOPROC
という名前が使われる。サブシェルのPIDは、NAME_PID
で参照できる。
関数
コマンドをグループ化して名前で一連のコマンド群を呼び出すことができる。以下ような特徴がある。
unset -f name
で関数定義を削除することができる。- 関数のbodyを囲む
{ }
では、前後にブランクや改行での区切りが必要。 - 関数への引数は$
NUMBER
で参照できる(引数は1から) DEBUG
やRETURN
トラップは関数に継承されないため、もし設定を引き継ぎたい場合は、set -o functrace
、関数内でDEBUG
やRETURN
のトラップを指定する、declare -t
で宣言するのいずれかの方法を用いる必要がある。- FUNCNEST変数でネスト数を指定することができる。ネスト回数を超えて関数を呼び出しした場合、関数の実行は中断される。
return 数値
で関数の終了ステータスを指定できる。指定がない場合は、関数の最終コマンドの実行結果が関数の終了ステータスとなる。local varname
でvarname
は関数ローカルの変数となる。
trap DEBUGと-o functraceを使って以下のようなデバッグもできる(以下のサンプルは簡単かつ稚拙な例、bashdbの方が高度で実用的である)。
これを実行すると以下のようになる。
条件式
[[
、test
、[
で使われる。
式 | 説明 |
---|---|
-a file | fileが存在すればTrue |
-b file | fileが存在しブロックスペシャルファイルの場合はTrue |
-c file | fileが存在しキャラクタスペシャルファイルの場合はTrue |
-d file | fileが存在しディレクトリの場合はTrue |
-e file | fileが存在すればTrue |
-f file | fileが存在し通常ファイルの場合はTrue |
-g file | fileが存在しSet Group IDがセットされている場合はTrue |
-h file | fileが存在しシンボリックリンクの場合はTrue |
-k file | fileが存在しスティッキービットがOnの場合はTrue |
-p file | fileが存在し名前付きPIPEの場合はTrue |
-r file | fileが存在し読み取り可能の場合はTrue |
-s file | fileが存在しファイルサイズが0以上の場合はTrue |
-t fd | ファイルディクリプタ(fd)がopenされており、ターミナルを指している場合はTrue |
-u file | fileが存在しSet User Idがセットされている場合はTrue |
-w file | fileが存在し書き込み可能な場合はTrue |
-x file | fileが存在し実行可能な場合はTrue |
-G file | fileが存在し有効なグループIDに属する場合はTrue |
-L file | fileが存在しシンボリックリンクの場合はTrue |
-N file | fileが存在し最後に読み取りされてから修正された場合はTrue |
-O file | fileが存在し有効なユーザーIDに属する場合はTrue |
-S file | fileが存在しソケットファイルの場合はTrue |
file1 -ef file2 | file1とfile2が同じデバイスファイルでinode番号が同じ場合はTrue |
file1 -nt file2 | file2がfile2より最終更新日が新しい、または、file1が存在しfile2が存在しない場合はTrue |
file1 -ot file2 | file2がfile2より古い、または、file2が存在しfile1が存在しない場合はTrue |
-o optname | optnameが有効な場合はTrue |
-v varname | varnameの変数がセットされている場合はTrue |
-R varname | varnameの変数がセットされかつ名前参照の場合はTrue |
-z string | stringの長さが0の場合はTrue |
-n string | stringの長さが0でない場合はTrue |
string1 == string2 string1 = string2 |
string1とstring2が等しい場合はTrue |
string1 != string2 | string1とstring2が等しくない場合はTrue |
string1 < string2 | string1が辞書並びでstring2より前に来る場合はTrue |
string1 > string2 | string2が辞書並びでstring1より前に来る場合はTrue |
arg1 OP arg2 | 以下数値比較で用いる。
|
参考リンク
- man bash
- https://www.gnu.org/software/bash/manual/bashref.html
- http://qiita.com/kiida/items/3beb1bf718cdc2f0798a
- http://wiki.bash-hackers.org/start
オライリージャパン
売り上げランキング: 243,409