[ シェルスクリプト 〜Linuxをちょっと便利に使うために〜 ] この記事はLinuxのシェルスクリプトに関して説明しています。正直Perlで全 然こと足りるんですが、なんとなく勉強してみました。 test.sh ------------------------------------------------------------------------------ #!/bin/sh echo test ------------------------------------------------------------------------------ [kenji@localhost shell]$ chmod 755 test.sh [kenji@localhost shell]$ ./test.sh test [kenji@localhost shell]$ まずは文字列表示です。 ls2.sh ------------------------------------------------------------------------------ #!/bin/sh ls ------------------------------------------------------------------------------ [kenji@localhost shell]$ chmod 755 ls2.sh [kenji@localhost shell]$ ./ls2.sh ls2.sh test [kenji@localhost shell]$ そのまま書くと、コマンドとして実行されます。 test2.sh ------------------------------------------------------------------------------ #!/bin/sh VAL=myVal echo $VAL ------------------------------------------------------------------------------ [kenji@localhost shell]$ chmod 755 test2.sh [kenji@localhost shell]$ ./test2.sh myVal [kenji@localhost shell]$ 変数です。変数には基本的に大文字が使用されるようです。代入には'$'はつ けないけれど、参照の時は'$'が必要なようです。'='の左右にスペースなどを いれたりすると実行できなくなります。シェルスクリプトはそのへんが厳格で すので注意してください。 test3.sh ------------------------------------------------------------------------------ #!/bin/sh VAL=myVal echo $VAL HOGE=.c echo $VAL$HOGE echo $VAL$HOGEtxt echo ${VAL}${HOGE}txt echo ${VAL}$HOGE.txt echo ${VAL}$HOGE/txt ------------------------------------------------------------------------------ [kenji@localhost shell]$ chmod 755 test3.sh [kenji@localhost shell]$ ./test3.sh myVal myVal.c myVal myVal.ctxt myVal.c.txt myVal.c/txt [kenji@localhost shell]$ 変数の後に文字列をつけたい場合は ${HOGE} のように変数を括弧で括って使 用するようです。ただし'.'(ドット)、'/'(スラッシュ)などのような変数に使 われない文字列が後につくならば必要ないようです。 if2.sh ------------------------------------------------------------------------------ #!/bin/sh VAL=4 if [ $VAL -eq 5 ] then echo "true" else echo "false" fi ------------------------------------------------------------------------------ [kenji@localhost shell]$ ./if2.sh false [kenji@localhost shell]$ if文です。chmod 755 if2 は省きました。(以後すべて省いてます)条件に関し ては以下にまとめました。 なお'['や']'の左右はスペースをいれなければならないようです。 < 数値評価演算子 > シェル | C 言語 | 「真」になる条件 --------+----------+------------------- A -eq B | (A == B) | AとB が等しい場合 A -ne B | (A != B) | AとB が異なる場合 A -ge B | (A >= B) | AがB以上である場合 A -le B | (A <= B) | AがB以下である場合 A -gt B | (A > B) | AがBより大きい場合 A -lt B | (A < B) | AがBより小さい場合 これらは比較対象が数字の場合の話です。文字列だとエラーになります。 < 文字列評価演算子 > < 論理演算子 > シェル | 「真」になる条件 | -------+------------------- -------+----------------------- A = B | AとB が等しい場合 A -a B | AかつB (論理演算AND) A != B | AとB が異なる場合 A -o B | AまたはB (論理演算OR) -n A | AがNULLでない場合 ! A | Aではない -z A | AがNULLである場合 | exist.sh ------------------------------------------------------------------------------ #!/bin/sh if [ -e test.txt ] then echo "true" else echo "false" fi ------------------------------------------------------------------------------ [kenji@localhost shell]$ ls test.txt test.txt [kenji@localhost shell]$ ./exist.sh true [kenji@localhost shell]$ | 「真」になる条件 ---+-------------------------- -d | ディレクトリ -e | ファイルが存在する -f | 通常のファイル -L | シンボリックリンクファイル -s | ファイルサイズが0でない -r | ファイルが読み込み可能 -w | ファイルが書き込み可能 -x | ファイルが実行可能 Perlで使用するものと同じです。(おそらく) arg.sh ------------------------------------------------------------------------------ #!/bin/sh echo "引数 $# 個" echo "$1 $2 $3" ------------------------------------------------------------------------------ [kenji@localhost shell]$ ./arg.sh ee rr tt 引数 3 個 ee rr tt [kenji@localhost shell]$ 引数とかも受け取れます。ちなみに $0 は実行されているスクリプトそのもの です。(この場合は arg.sh) case.sh ------------------------------------------------------------------------------ #!/bin/sh case $1 in A) echo "AAAAA";; B) echo "BBBBB";; 55) echo "55!!";; esac ------------------------------------------------------------------------------ [kenji@localhost shell]$ ./case.sh A AAAAA [kenji@localhost shell]$ ./case.sh B BBBBB [kenji@localhost shell]$ ./case.sh 55 55!! [kenji@localhost shell]$ Cでいうswitchですね。 loop.sh ------------------------------------------------------------------------------ #!/bin/sh i=0 while [ $i -le 5 ]; do echo $i i=`expr $i + 1` done ------------------------------------------------------------------------------ [kenji@localhost shell]$ ./loop.sh 0 1 2 3 4 5 [kenji@localhost shell]$ exprコマンドは実際に試してみて下さい。 [kenji@localhost shell]$ expr 3 + 4 7 [kenji@localhost shell]$ expr 3 + 4 + 5 12 [kenji@localhost shell]$ シェルスクリプトは演算の機能が無いようなのでコマンドの力を借ります(笑) loop2.sh ------------------------------------------------------------------------------ #!/bin/sh for i in 0 1 2 3 4 5; do echo $i done ------------------------------------------------------------------------------ [kenji@localhost shell]$ ./loop2.sh 0 1 2 3 4 5 [kenji@localhost shell]$ forバージョンです。特に問題無いです。 func.sh ------------------------------------------------------------------------------ #!/bin/sh func() { echo "this is func." echo "$1 $2 $3" } func aaa bbb ccc ------------------------------------------------------------------------------ [kenji@localhost shell]$ ./func.sh this is func. aaa bbb ccc [kenji@localhost shell]$ 関数です。引数は $1 $2 $3 に入ります。 sam.sh ------------------------------------------------------------------------------ #!/bin/sh for FN in `cat func.sh` do echo $FN sleep 1 done echo "END" ------------------------------------------------------------------------------ [kenji@localhost shell]$ ./sam.sh #!/bin/sh func() { echo "this is func." echo "$1 $2 $3" } func aaa bbb ccc END [kenji@localhost shell]$ こんなこともできます。改行とスペースまでを変数に代入しています。一秒に 一行ずつ表示されるはずです。 main.c ------------------------------------------------------------------------------ void test(void); int main(void) { test(); return 0; } ------------------------------------------------------------------------------ test.c ------------------------------------------------------------------------------ #include void test(void) { printf("test\n"); } ------------------------------------------------------------------------------ これをコンパイルする場合 [kenji@localhost shell]$ gcc -Wall main.c test.c -o print [kenji@localhost shell]$ というように打たなければならないが、なんさまこんなに長い文章を毎回プロ グラムを変更した際に打ち込むのはメンドイのでシェルスクリプトを用意する。 make.sh ------------------------------------------------------------------------------ #!/bin/sh CC=gcc TYPE=-Wall MAIN=main TEST=test FILE=print FS=.c ${CC} ${TYPE} ${MAIN}${FS} ${TEST}${FS} -o ${FILE} ------------------------------------------------------------------------------ [kenji@localhost shell]$ chmod 755 make.sh [kenji@localhost shell]$ ./make.sh [kenji@localhost shell]$ [kenji@localhost shell]$ ./print test [kenji@localhost shell]$ 特に難しいことはやってない。まぁ見ればわかるだろう。しかしこれだとプロ グラムファイルを変更した場合このファイルも変更しなければならなくなる。 よってもっと賢いファイルを作成する。 make2.sh ------------------------------------------------------------------------------ #!/bin/sh CC=gcc TYPE=-Wall EXE=print FILES=`find *.c` ${CC} ${TYPE} ${FILES} -o ${EXE} ------------------------------------------------------------------------------ [kenji@localhost shell]$ chmod 755 make2.sh [kenji@localhost shell]$ ./make2.sh [kenji@localhost shell]$ [kenji@localhost shell]$ ./print test [kenji@localhost shell]$ find で *.c のファイルを検索してそれらを gcc の引数に渡している。これ だとプログラムのファイルが追加や削除されてもこのまま使うことができる。 最後に ぶっちゃけ Perl で十分なんですが、まぁ覚えといて損は無いかなと思ってやっ てみました。DOSにも似たようなのがあるようなのでそっちもいつかやろうか な。とか思ってますけど、どうだろ(^^; End. written by kenji aiko 2003/11/27 Copyright (C) 2003 kenji aiko All Rights Reserved