システム・プログラム 電子・情報工学系 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/classes/syspro-2003/2003-06-23
/sh.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.is.tsukuba.ac.jp/~yas/index-j.html
入出力の切替え
---------------------------------------------------------------------- <file 標準入力をfileに切替える。 >file 標準出力をfileに切替える。fileの内容が上書きされる。 2>file 標準エラーをfileに切替える。fileの内容が上書きされる。 n>file ファイル記述子nをfileに切替える。fileの内容が上書きされる。 n<file ファイル記述子nをfileに切替える。 >>file 標準出力をfileに切替える。fileの末尾に追加される。 2>&1 標準エラーを標準出力と同じにする。 <&- 標準入力を閉じる。 >&- 標準出力を閉じる。 p1 | p2 p1 の標準出力をパイプに、p2 の標準入力をパイプに p1 <<EOF p1 の標準入力を、EOF という文字がが現れるで。 ... EOF p1 <<EOF p1 の標準入力を、EOF という文字がが現れるで。 ... 変数を展開しない。 EOF' ---------------------------------------------------------------------- '''引数
---------------------------------------------------------------------- $1 $2 $3 ... n番目の引数 $0 プログラムの名前 $* 全引数 $@ 全引数 "$@" 全引数(展開しない) $# 引数の数 shift 引数のシフト read var 標準入力から1行入力 ----------------------------------------------------------------------シェル変数。csh とは異なり、setは不要。
---------------------------------------------------------------------- var=value シェル変数の設定 var="value1 value2" シェル変数の設定 unset var シェル変数の解除(古いshにはない) $var "$var" ${var} シェル変数の利用。 $$ PID ----------------------------------------------------------------------sh には、「$var[index]」や「@ var=式」はない。
sh の環境変数は、シェル変数のうち export したもの。
---------------------------------------------------------------------- var=value; export var 環境変数の設定 var="value1 value2"; export var 環境変数の設定 unset var 環境変数の解除 $var "$var" ${var} 環境変数の利用 ----------------------------------------------------------------------コメント
---------------------------------------------------------------------- # コメント ----------------------------------------------------------------------引用符、エスケープ
---------------------------------------------------------------------- "..." $、``、\を解釈した文字列 '...' 文字列 `...` ...にあるプログラムを実行 \c cそのもの(\* や \")で使う \改行 行末のキャンセルX(1行で書けない時の継続行) ----------------------------------------------------------------------ファイル名、文字列の展開
---------------------------------------------------------------------- * 0文字以上の任意の文字列 ? 任意の1文字 [abc] []の中の任意の1文字 ----------------------------------------------------------------------sh では、「~user」はない。bash にはある。
if文
---------------------------------------------------------------------- if [ ... ] then cmd fi if [ ... ] then cmd else cmd fi if [ ... ] then cmd elif [ ... ] cmd elif [ ... ] cmd else cmd fi ----------------------------------------------------------------------'[' は、実は、そういう名前のコマンドである。マニュアルは、test で参照 できる。
---------------------------------------------------------------------- % ls -l /usr/bin/['[' コマンドの他に、普通のコマンドを書くこともできる。lrwxr-xr-x 1 root sys 15 2月 4日 1998年 /usr/bin/[ -> ../../sbin/test %
----------------------------------------------------------------------
---------------------------------------------------------------------- if cmd then cmd else cmd fi ----------------------------------------------------------------------if の cmd が exit 0 すると true、それ以外だと false となる。 (C言語と逆なので注意。)
if と同じ行に then を書く時には、「;」を付ける。
---------------------------------------------------------------------- if [ ... ] ; then cmd fi ----------------------------------------------------------------------
ループ
---------------------------------------------------------------------- while [ ... ] do cmd done for var in w1 w2 w3 w4 do cmd $var done ----------------------------------------------------------------------switch 文
---------------------------------------------------------------------- case string in pattern1) cmd;; pattern2) cmd;; *) cmd;; esac ----------------------------------------------------------------------その他
---------------------------------------------------------------------- exit 数 終了 exec cmd fork しないで自分自身で cmd を実行。戻ってこない。 . script fork しないで自分自身で script を実行。終了後、戻ってくる。 ----------------------------------------------------------------------'[' (test) コマンドで使える式
---------------------------------------------------------------------- -eq -gt -ge -lt -gt -le -ne 比較(数) = != 比較(文字列) ! -a -o 論理演算 -r filename 読み込み可能 -w filename 書き込み可能 -x filename 実行可能 -e filename ファイルが存在する -f filename 普通のファイルが存在する -d filename ディレクトリが存在する -s filename ファイルが空でない str 空でなければ真。"$var" の形式で使うのが普通。 ( ) 式のグループ化 ----------------------------------------------------------------------実行構造
---------------------------------------------------------------------- p1 ; p2 p1 の実行後 p2 の実行。 p1 & p1 のバックグランド実行(waitしない) p1 && p2 p1 を実行して、失敗したら終わり。成功したら p2 を実行。 p1 || p2 p1 を実行して、成功したら終わり。失敗したら p2 を実行。 ( cmd ) fork して子プロセスで cmd を実行する。cd したい時など使う。 ----------------------------------------------------------------------
---------------------------------------------------------------------- #!/bin/sh ls_l() { ls -l $* } ls_l $* ----------------------------------------------------------------------
---------------------------------------------------------------------- % shシェルスクリプトでは、for f in * の代りに、for f in $* を使えば引数、 `cat file` を使えば、file の内容ついてルー プを実行することができる。$ for f in *
> do
> echo $f
> done
file1 file2 file3 $
----------------------------------------------------------------------
---------------------------------------------------------------------- % sh$ x=`expr 1 + 2`
$ echo $x
3 $
----------------------------------------------------------------------
---------------------------------------------------------------------- $ x="" $ for i in a b c > do > x="$x""$i" > done $ echo $x abc $ ----------------------------------------------------------------------
exit(0);
した時に、成功(true)、それ以外の時に失敗(false) と扱う。
$ if /bin/true; then echo ok; fi ok $ if /bin/false; then echo ok; fi $