SYNTAX
Result
SYNTAX
$?
wget "http://ur" | grep "現在おさがしの物件はありません"
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
(.) 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
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
// 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
ls
echo * # echo foo bar goo と展開される.
WARNING
regexp とは異なる
[ . ] : 任意の一文字ではない
POINT
wildcard の置換結果は echo ですれば OK
改行(newline)
SYNTAX
$'\n'
DESC
改行するには $'\n'
POINT
// RET
// aaa
// bbb
echo $'aaa\nbbb'