SYNTAX





Result


SYNTAX $? # たとえば tool の成否を調べる wget "http://ur" | grep "現在おさがしの物件はありません" # RET: 1 echo $? POINT 関数内で宣言した変数は呼び出しshellで使用できる <-> local i=1; で 関数local


空白の扱い\spaceで対処


DESC alias cdwinbin="cd C:/Program\ Files/"


stdout出力


cygwin foo | cat POINT: program とはbit列を入力として、bit列を出力するもの fileもbit列 ゆえにfile のリダイレクトやパイプという仕組みができる


system





Shell.とは


DESC program を起動すること 存在理由
 (.) プログラムを実行させる、データを保存する == タイヤとエンジン  (.) ハンドルに相当する操作する仕組みが必要それがシェル( 制御システム ) (.) ユーザの指令を解釈して実行するプログラムシェルとはコマンドインタープリタ
仕組み  コマンドラインをシェルのプロセスが読み取って、あるコマンドがコールされたことがわかる  2.ps のプログラムが実行されるプロセスを作成  3.ps プログラムが動き出す DESC
# どちらも Program であることにはかわりなし # (.) kernell == OS 機能を実装している program (.) shell == usr cmd を解釈 して kernell を call する program
usr -> os の仲介役 の種類 1. shell 2. tty driver : c-c 3. system call : c 言語を利用する際の kernell 窓口 shell の種類
(.) sh : history 機能をもたない sh ( scr intp に使用 ) (.) bash: history , cmdline 編集をもつ sh
shell の変更できます 1. 直接 shell 起動. EX. tcsh( cld ps として起動 ) 2. ps をのっとる . exec cmdName shell が program を呼ぶ仕組み 1. PATH 検索 2. ps 作成 3. / があれば直接その path を実行


Ridirect.Pipe


DESC シェルは「キーボードから入力し,画面に出力する」ようになっている。 入力と出力の方法を変更する場合には,リダイレクトを使う 出力先、入力先の指定はファイルディスクリプタという番号を使う。 0, 1, 2 はシステム側で予約されている。 番号を指定する( NO> )ことで特定の出力先だけを変更する。
test.sh > log.txt 2> err.txt # エラーを出力したくないときは /dev/null へ捨てる。 test.sh 2> /dev/null
入力 : プログラムが外部から情報を受け取ること 出力 : プログラムが外部へ情報を出力すること チャネル : データが流れる通路 ファイルディスクリプタ : 各processがopenしているファイルをUNIXが管理する際に使用する整数値( shell では10個まで) チャンネル(通路)0:キーボード  チャンネル(通路)1:画面 チャンネル(通路)2:画面 ( エラー情報をだすためのチャンネル ) 小話 昔はタイプライタ端末といって、紙に出力していた チャンネルの合流 SYNTAX cmd [arg] > foo.txt ( ch2 は端末へ, err を知らせるため )
test.sh > log.txt 2> err.txt test.sh > log.txt 2>&1



Pipe


DESC プログラムが標準入力から読み込んで、標準出力へ出力するとき、パイプができる
//OK  cat < test.txt | cat | cat // ERROR echo は標準入力から読まないのでエラー? cat < test.text | echo // 小文字を大文字に変換 echo this is a pen | tr a-z A-Z
シェルのコマンド制御のメタキャラクタ  cmd1 ; cmd2  コマンド1 &  コマンド2 ( 平行して実行 )  ( ps ; ls ) > t1 ps, ls の結果をまとめて t1に メタキャラクタの注意点  そのまま使用したい場合は \ ( エスケープする )  ””、 ’’クォートする"$var" は変数展開される'$var' は変更されない shell parse 順序
(.) $xxx : 置換 (.) 置換結果を処理 cmd arg
echo "foo$USER" echo "fooXXX" $1 == fooXXX として echo が処理



置換(Substitute)


DESC 置換とはあるものを、別のものでおきかえること シェルの場合の置換 特別な意味をもつ記号を別のものに変換  変数置換 EX : expr $a + $b , ("" の中では展開される ) WARNING '$foo' は置換されない : mv `find -type f -name "$word" ` POINT ${foo} // {} 範囲を明示する  コマンド置換 EX : foo='expr $a + $b' ( バッククォート )  ヒストリ置換 !99  ファイル名置換  * : 任意の文字列にマッチ ? : 任意の一文字にマッチ [...] : ... のどれか一文字にマッチ, クラス表現   [ 上記の表記を含む引数 ]があった場合、 シェルはマッチするファイルを探して、ファイル名の並びで置き換える    WARNING: シェルはすでにあるファイルにしか置き換えない cp *.c backup/*.c // BAD POINT 展開結果をみるには echo をつける、echo cp *.txt ./ ファイル置換は変換対象にマッチングしなければ、そのまま出力される mv *.sss foo.txt  (ファイル名置換後)−> mv *.sss foo.txt となる ''で置換の抑制 cmd にそのまま渡す : sed 's/foo*/bar/' tmp.txt


ヒアドキュメント(HereDocument)


DESC まとめて出力したい時に cat << EOS


Argument


REF getopts
# bash > ./foo.sh a b c // 3 echo $# // a b c echo $* // ./foo.sh echo $0 // a echo $1 // b echo $2 // c echo $3



Wildcard


DESC shell が [ file をマッチング ]する時に使用 * : 任意の1文字以上の文字列 ? ? : 任意の一文字 []: {}: Brace
# foo bar goo ls echo * # echo foo bar goo と展開される. # RET: foo bar goo
WARNING regexp とは異なる [ . ] : 任意の一文字ではない POINT wildcard の置換結果は echo ですれば OK


改行(newline)


SYNTAX $'\n' DESC 改行するには $'\n' POINT
// RET // aaa // bbb echo $'aaa\nbbb'