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