Bourne Shell 備忘録

すぐ忘れるので自分用の備忘録。もちろん Bourne Shell の機能・仕様を網羅しているわけではなく,あくまで自分の頻繁に使うものに限定しているに過ぎない。

  1. ファイル名メタキャラクタ
    * 0 文字以上の任意の文字列と一致
    ? 任意の 1 文字と一致
    [abc...] [] 内のいずれかの文字と一致。“-” で範囲を指定
  2. コマンドの形式
    cmd1 && cmd2 cmd1 実行後,cmd1 が正常終了したら cmd2 を実行
    cmd1 || cmd2 cmd1 実行後,cmd1 が異常終了したら cmd2 を実行
    ( cmd1 ; cmd2 ) cmd1cmd2 をコマンドグループとして取り扱う
    ex.:
    (date ; ls -l) > logfile
    datels -l のすべての出力をリダイレクトする
    { cmd1 ; cmd2 } コマンドを現在のシェルで実行
  3. リダイレクト
    cmd >&n 出力をファイル記述子 n に書き込む
    cmd m>&n ファイル記述子 m に書き込む内容をファイル記述子 n に書き込む
    cmd >&- 標準出力を閉じる
    cmd <&- 標準入力を閉じる
    cmd 2> file 標準エラーを file に書き込む
    cmd > file 2>&1 標準エラーと標準出力の両方を file に書き込む
    cmd > /dev/null 2>&1 標準エラーと標準出力の両方を破棄する
    (cmd > f1) 2>f2 標準出力を f1 に,標準エラーを f2 に書き込む
    cmd | tee files cmd の出力を標準出力と files(複数でも可)に書き込む
  4. 変数置換
    var=value 変数 var に値 value を代入する
    ${var} var の値を使用する
    ${var:-value} var 値設定時その値,未設定時 value を使用する
    ${var:+value} var 値設定時その値を使用,未設定時なにも使用しない
    ${var:=value} var 値設定時その値,未設定時 value を使用し値を var に代入する
  5. 組込みシェル変数
    $# コマンドライン引数の数
    $- 現在有効なオプション(sh, setに渡した引数)
    $? 最後に実行したコマンドのステータス
    $$ 現在のプロセスのプロセス番号
    $! 最後のバックグラウンドコマンドのプロセス番号
    $0 コマンド名
    $n コマンドラインの各引数(n=1-9)
    $* コマンドラインのすべての引数
    "$@" コマンドラインのすべての引数を個別に引用符で囲んだもの
  6. 組込みコマンド
    : ヌルコマンド。終了ステータスとして 0 を返す
    ex.: while : 常に真
    ex.: then : 条件が真のときなにもしない
    break [n] ループで最も内側のループを終了するか,最も内側の n レベルのループを終了する
    continue [n] ループで残りのコマンドを実行せず,ループの次の繰り返しを再開する。ループを n 回スキップする
    case value in
      p1) cmds1;;
      p2) cmds2;;
      ...
    esac
    valuep1 と一致する場合 cmds1p2 と一致する場合 cmds2 を実行
    eval args 変数 args を強制的に展開し,その結果作成されたコマンドを実行
    ex.: opt によってファイル出力・画面出力を選択
    if [ $opt = "f" ]; then
      out=' > file'
    else
      out=' | more'
    fi
    eval sort file $out
    for x [in list]
    do
      commands
    done
    変数 x を値リスト list 各要素に置き換えながら commands を実行。list 省略時 "$@"(コマンドライン引数リスト)
    shift [n] 定位置パラメータを左に 1 [n] だけシフト。n 省略時 $2$1 になる
    test condition または
    [ condition ]
    条件の検査。
    - if 文
    if [ condition ]; then
      cmd1
    else
      cmd2
    fi
    - while 文
    while [ condition ]
    do
      commands
    done
     - ファイル条件
      -a file 存在
      -d file 存在しディレクトリである
      -f file 存在し通常ファイルである
      -s file 存在し0より大きいサイズである
      -w file 存在し書き込み可能である
      -x file 存在し実行可能である
      f1 -nt f2 ファイル f1f2 より新しい
      f1 -ot f2 ファイル f1f2 より古い
     - 文字列条件
      -n s1 文字列 s1 の長さが 0 以外
      -z s1 文字列 s1 の長さが 0
      s1 = s2 文字列 s1s2 が同一
      s1 != s2 文字列 s1s2 が同一でない
     - 数値条件
      n1 -eq n2 n1n2 と等しい
      n1 -ge n2 n1n2 と等しいか,それより大
      n1 -gt n2 n1n2 より大
      n1 -le n2 n1n2 と等しいか,それより小
      n1 -lt n2 n1n2 より小
      n1 -ne n2 n1n2 と等しくない
    trap [[commands] signals] signals を受信したとき commands を実行する
    ex.: trap "echo \'interrupt\!\'; ls" 2
    CTRL-C で割り込みを検知したら interrupt! を出力して ls コマンドを実行する
    while [condition]
    do
      commands
    done
    condition が真の間 commands を実行
  7. ジョブ制御
    - ジョブID
     %n ジョブ番号 n
     %s コマンドラインが文字列 s から始まるジョブ
     %?s コマンドラインに文字列 s が含まれるジョブ
     %% 現在のジョブ
     %+ 現在のジョブ
     %- 直前のジョブ
    - ジョブ制御コマンド
     bg バックグラウンドに設定
     fg フォアグラウンドに設定
     jobs アクティブジョブをリスト
     kill ジョブを終了
     stop 一時停止
     CTRL-Z フォアグラウンドジョブを一時停止し,fg | bg を使用