2006年06月23日 コンピュータリテラシ 筑波大学 電子・情報工学系 コンピュータサイエンス専攻 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2006/No10_files/sh.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/
YHM_Shell3(
sh で環境変数とは、シェル変数のうち export したものである。 YHM_Shell3( var=value; export var 環境変数の設定 var="value1 value2"; export var 環境変数の設定 unset var 環境変数の解除 $var "$var" ${var} 環境変数の利用 ) YHM_Shell3(`dnl # コメント ') YHM_Shell3(`dnl "..." $、YHM_Backquote()YHM_Backquote()、\を解釈した文字列 YHM_Quote()...YHM_Quote() 文字列 YHM_Backquote()...YHM_Backquote() ...にあるプログラムを実行 \c cそのもの(\* や \")で使う \改行 行末のキャンセルX(1行で書けない時の継続行) ') YHM_Shell3(`dnl * 0文字以上の任意の文字列 ? 任意の1文字 [abc] []の中の任意の1文字 ') オリジナルの sh では、「~user」はない。bash にはある。 sh という名前でありながら、実際には bash になっていることも多く、 その場合は sh でも使える。
YHM_Shell3(`dnl if [ ... ] then cmd fi if [ ... ] then cmd else cmd fi if [ ... ] then cmd elif [ ... ] cmd elif [ ... ] cmd else cmd fi ') test という名前の子マントが存在する。 YHM_Shell3(``dnl % ls -l /usr/bin/test -rwxr-xr-x 1 root root 16004 Jan 16 2001 /usr/bin/test % file /usr/bin/test /usr/bin/test: ELF 32-bit LSB executable``,'' Intel 80386``,'' version 1 (SYSV)``,'' for GNU/Linux 2.0.0``,'' dynamically linked (uses shared libs)``,'' stripped % '') '[' は、伝統的には、そういう名前の外部コマンドである。 (sh の内部コマンドとして実装されていることもある。) マニュアルは、test で参照できる。 YHM_Shell3(`dnl % ls -l /usr/bin/[ lrwxrwxrwx 1 root root 4 Feb 24 2002 /usr/bin/[ -> test % ') '[' コマンドの他に、普通のコマンドを書くこともできる。 YHM_Shell3(`dnl if cmd then cmd else cmd fi ') if の cmd が exit 0 すると true、それ以外だと false となる。 (C言語と逆なので注意。)
if と同じ行に then を書く時には、「;」を付ける。 YHM_Shell3(`dnl if [ ... ] ; then cmd fi ')
YHM_Shell3(`dnl while [ ... ] do cmd done for var in w1 w2 w3 w4 do cmd $var done ') YHM_Shell3(``dnl c`'ase st`'ring in pattern1``)'' cmd;; pattern2``)'' cmd;; *) cmd;; esac '') YHM_Shell3(`dnl exit 数 終了 exec cmd fork しないで自分自身で cmd を実行。戻ってこない。 . script fork しないで自分自身で script を実行。終了後、戻ってくる。 ') YHM_Shell3(`dnl -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" の形式で使うのが普通。 ( ) 式のグループ化 ') YHM_Shell3(`dnl p1 ; p2 p1 の実行後 p2 の実行。 p1 & p1 のバックグランド実行(waitしない) p1 && p2 p1 を実行して、失敗したら終わり。成功したら p2 を実行。 p1 || p2 p1 を実行して、成功したら終わり。失敗したら p2 を実行。 ( cmd ) fork して子プロセスで cmd を実行する。cd したい時など使う。 ') 最近の sh や bash では、関数が定義できる。 YHM_Shell3(`dnl #!/bin/sh ls_l() { ls -l $* } ls_l $* ') for は、引数 $*、全てのファイル *、バック・クォート `` といっしょに使うことが多い。 YHM_Shell3(``dnl % sh $ for f in * > YHM_User(do)YHM_CR() > YHM_User(echo $f)YHM_CR() > YHM_User(done)YHM_CR() file1 file2 file3 $ '') シェルスクリプトでは、for f in * の代りに、for f in $* を使えば引数、 `cat file` を使えば、file の内容ついてルー プを実行することができる。 数の計算が必要な時には、sh では、expr コマンドを使う。 結果をシェル変数に入れるには、``と組み合わせる。 YHM_Shell3(``dnl % sh $ x=YHM_Backquote()expr 1 + 2`'YHM_Backquote() $ echo $x 3 $ '') YHM_Shell3(`dnl $ x="" $ for i in a b c > do > x="$x""$i" > done $ echo $x abc $ ') if 文では、コマンドが成功したか失敗したかを調べることができる。
exit(0);
した時に、成功(true)、それ以外の時に失敗(false) と扱う。
YHM_Shell3(`dnl
$ if /bin/true; then echo ok; fi
ok
$ if /bin/false; then echo ok; fi
$
')