Bash

この記事は約11分で読めます。

変数展開

記述 説明
${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から)
  • DEBUGRETURNトラップは関数に継承されないため、もし設定を引き継ぎたい場合は、set -o functrace、関数内でDEBUGRETURNのトラップを指定する、declare -tで宣言するのいずれかの方法を用いる必要がある。
  • FUNCNEST変数でネスト数を指定することができる。ネスト回数を超えて関数を呼び出しした場合、関数の実行は中断される。
  • return 数値で関数の終了ステータスを指定できる。指定がない場合は、関数の最終コマンドの実行結果が関数の終了ステータスとなる。
  • local varnamevarnameは関数ローカルの変数となる。

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 以下数値比較で用いる。

  • arg1 -eq arg2
    • arg1とarg2が等しい
  • arg1 -ne arg2
    • arg1とarg2は等しくない
  • arg1 -lt arg2
    • arg1はarg2より小さい
  • arg1 -le arg2
    • arg1はarg2以下
  • arg1 -gt arg2
    • arg1はarg2より大きい
  • arg1 -ge arg2
    • arg1はarg2以上

参考リンク

  • man bash
  • https://www.gnu.org/software/bash/manual/bashref.html
  • http://qiita.com/kiida/items/3beb1bf718cdc2f0798a
  • http://wiki.bash-hackers.org/start
入門bash 第3版

入門bash 第3版

posted with amazlet at 16.07.29
Cameron Newham Bill Rosenblatt
オライリージャパン
売り上げランキング: 243,409
タイトルとURLをコピーしました