#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 / [] やコマンドの終了コードを使う - パターンはワイルドカード使用可能 * 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