#contents

* はまりどころ

 #!/bin/sh
 COMMAND="command 'arga argb'"
 $COMMAND
 ARGS="'arga argb'"
 command $ARGS

- 'arga
- argb'

が引数だと思われる

 `$COMMAND`

- 'arga を実行しようとして失敗する

* 動作チェック用

** 引数出力

	#!/bin/sh
	
	while [ $# -gt 0 ]
	do
		echo $1
		shift
	done

* 条件分岐/繰り返し

	if 条件 ; then
		〜
	elif 条件 ; then
		〜
	else
		〜
	fi

	while 条件 ; do
		〜
	done

	until 条件 ; do
		〜
	done

	for 変数名 in リスト ; do
		〜
	done

	case 文字列 in
		パターン)
			〜
			;;
		パターン|パターン)
			〜
			;;
		*)
			〜
			;;
	esac

	break
	continue

- 条件は test / [] やコマンドの終了コードを使う
- パターンはワイルドカード使用可能

* function

 # function はなくてもよい
 function foo()
 {
 	local x y z
 	local a=10
 
 	# 返値を設定するだけ
 	# function を抜けるわけではない
 	return 0
 	return 1
 }

* test / []

 test EXPRESSION
 [ EXPRESSION ]

- 変数を使うときは "" で括っておかないとそれがないものとして扱われる~
-- [ -z ] や [ -n ] は真になるのでハマりどころ
- 引数0個(EXPRESSIONが空)は偽

 ! EXPRESSION
 ( EXPRESSION )
 EXPRESSION -a EXPRESSION
 EXPRESSION -o EXPRESSION

** ファイルテスト
| -e | 存在 |
| -s | サイズ0以上 |
| -f | ノーマルファイル |
| -d | ディレクトリ |
| -b | ブロック特殊ファイル |
| -r | 読込可 |
| -w | 書込可 |
| -x | 実行可 |

** 文字列比較
| -n STRING | 長さ0以上 |
| -z STRING | 長さ0 |
| STRING = STRING | |
| STRING != STRING | |
| STRING | 空文字列なら偽 |

** 数値比較
| -eq | = |
| -ne | ≠ |
| -lt | < |
| -le | ≦ |
| -gt | > |
| -ge | ≧ |

** 二重ブラケット

 [[ EXPRESSION ]]

- bash zsh など(bshにはない)
- bashとzshで挙動が違う
- manを引いとくのが正解

 ! EXPRESSION
 ( EXPRESSION )
 EXPRESSION && EXPRESSION
 EXPRESSION ll EXPRESSION

* ワイルドカード

| * | 文字列 |
| ? | 任意の1文字 |
| [...] | []内どれか1文字 |
| [^...] | []内以外 |
| [!...] | []内以外 |

* 特殊変数

| $? | 最後に実行したコマンドのexit値 |
| $$ | シェル自身のプロセスID |
| $! | シェルが最後に起動したバックグラウンドプロセスのプロセスID |
| $0 | スクリプトの名前 |
| $1〜9 | n番目の引数 |
| $# | 引数の個数 |
| $* | 全引数リスト "〜"中の展開は "$1 $2 … $n" |
| $@ | 全引数リスト "〜"中の展開は "$1" "$2" … "$n" |

* リダイレクト

 OK > /dev/null 2>&1
 NG > 2>&1 /dev/null

2>&1 は 2の出力先を1に向ける から。

* クオート

- "〜" 中の特殊文字は ` \ $
-- 変数展開、コマンド展開が行われる
- `〜` と $(〜) は同じ

* グルーピング

 (COMMAND)
- サブシェルで実行される
 
 { COMMAND; }
- カレントシェルで実行される
- {} とコマンドの間にはスペースが必須
- 最後の ; も必須

* リンク

- http://www.rhythm-cafe.com/shell/Default.aspx
- http://members.jcom.home.ne.jp/j-klein/shell/shellscript-basic.html
- http://www.ybi.co.jp/koike/src/BSH.htm
- http://www.klab.ee.utsunomiya-u.ac.jp/~hiroki/csh-whynot.euc
- http://www.netfort.gr.jp/~tomokuni/lms/shell/text/shell.txt
- http://www.netfort.gr.jp/~tomokuni/lms/shell/text/shell2.txt
- http://www.netfort.gr.jp/~tomokuni/lms/shell/text/shell3.txt
- http://www.netfort.gr.jp/~tomokuni/lms/shell/text/shell4.txt

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS