シェルスクリプトの使い方
[1]はじめてのシェルスクリプト
シェルスクリプトは以下のような内容のテキストファイルだ。-----(my_echo.sh)-----
#(my_echo.sh)
#!/bin/sh
echo $@
exit 0
---- -----
とりあえずこのとおり打ち込んでmy_echo.shという名前で保存してほしい。
Msys環境で
$sh ./my_echo.sh Hello
と打ち込むと Hello と表示されるはずだ。
以下内容の説明をする。
1)#で始まる行はコメントだが #!ではじまる行はコメントではない。
#!のあとにはスクリプトを実行するインタープリタの位置を書く。
perlスクリプトなら/usr/bin/perl シェルスクリプトなら/bin/shだ。
2)$@はスクリプトに渡されたパラメタに展開される。
$sh ./my_echo.sh foo bar
のように実行された場合、
$@ は foo bar に展開されて
echo $@ の行は
echo foo bar となる。
(その他$1は一番目のパラメタ $2は2番目のパラメタ $#はパラメタの数 等)
3)シェルスクリプトは返り値をもっている。exit 0 なら正常終了 0以外なら異常終了だ。忘れずに書こう。
[2]if文
1.構文if conditon then statements else statements fi |
if conditon then statements elif statements ... else statements fi |
2.サンプル
---- ----
#(my_love.sh)
#!/bin/sh
echo -n "Do you love me? (yes or no)"
read yes_no
if test x"$yes_no" = xyes ; then
echo "I love you."
else
echo "I hate you."
fi
exit 0
----- -----
3.解説
1)if のあとの判断でよく利用するのはtestコマンドだ。代表的なtestコマンドの使い方を<表1>にまとめておいた。
2)変数の内容を読み出すときは必ず$をつける。
x"$yes_no"はx(yes_noの内容)となる。
3)変数の読み出しの時は”"”でくくったがいい。
"$yes_no".gif を$yes_no.gif と書いてしまうと
yes_no.gifという変数の内容すなわち空文字列になってしまう。
4)変数の比較をするときは xをつけたほうがいい。
"$yes_no" = yes とやると yes_noが空のときにエラーとなる。
5)thenの前の";"を忘れやすいので注意。
if文構文を一行で書くと以下のようになる。
if test x"$yes_no" = xyes; then echo "I love you."; else echo "I hate
you."; fi
[3]for文
1.構文for variable in values do statements done |
--- ---
#(my_rename.sh)
#!/bin sh
for foo in `ls *.c`; do
bar=${foo%%.c}.cpp
mv $foo $bar
done
exit 0;
--- ----
3.解説
1)代入のときの=の横にスペースを入れてはいけない。比較の時は入 れるのでミスしやすい。
2)”`"で囲まれたコマンドは実行され出力を文字列化したものに置き換わる。
for foo in xxxx.c yyyy.c zzz.c ...... という具合だ。
3)${pram%%word}はparamの末尾を起点としてwordに一致するpramの最長部分を削除して残りを返す。
(他に %末尾から最短、 ##先頭から最長、 #先頭から最短 がある)
[4]case文
1.構文case variable in pattern [ |pattern]...) statements ;; pattern [ |pattern]...) statements ;; ... esac |
---- ----
#(my_love2.sh)
#!/bin/sh
echo -n "Do you love me? (yes or no)"
read yes_no
case $yes_no in
*yes*)
echo "I love you."
;;
y|Y|*Yes*|*YES*)
echo "I love you."
;;
n|N|*no*|*NO*|No*)
echo "I hate you."
;;
*)
echo "Bye bye."
;;
esac
exit 0
----- -----
3.解説
1)変数には`ls`の結果や$@など非常に長い変数も使える(非常に便利だ)。
2)*は任意の文字列にマッチする。
3)条件は|でつないでいくつも書ける。
ちょっと複雑だが、非常に便利な構文だ。必ずマスターしよう。
[5]最後に
ここでは代表的な構文を3つ解説した。これだけで結構有用なスクリプトが書けるはずだ。もっと上手く使いたいと思う諸兄は参考文献などを参照して勉強してほしい。
<表1>代表的な testコマンドの条件
文字列比較 | |
string | 文字列が空でなければ真 |
string1 = string2 | 文字列が等しければ真 |
string1 != string2 | 文字列が等しくなければ真 |
-n string | 文字列が空でなければ真 |
-z string | 文字列が空なら真 |
算術比較 | |
expression1 -eq expression2 | = |
expression1 -ne expression2 | != |
expression1 -gt expression2 | > (greater than) |
expression1 -ge expression2 | >= (reater equal) |
expression1 -lt expression2 | < |
expression1 -le expression2 | <= |
! expression | 否定(式が真なら 偽、偽なら真) |
ファイルの条件 | |
-d file | ディレクトリなら真 |
-e file | 存在すれば真(通常-eではなく-fオプションを使うことになってる) |
-f file | 通常ファイルなら真 |
-g file | set-group-idがセットされれば真(windowsにはない) |
-r file | 読み取り可能なら真 |
-s file | サイズが0でなければ真 |
-u file | set-user-idがセットされれば真(windowsにはない) |
-w file | 書き込み可能なら真 |
-x file | 実行可能なら真(windowsにはない) |
<参考文献>
"Linuxプログラミング 例題で学ぶUNIXプログラミング環境のすべて",Neil
Matthew & Richard Stones,葛西重夫訳,1999,ソフトバング
このHPの内容について問題があればsけいし(skeishi@yahoo.co.jp)まで連絡ください。
DevCPPの使い方に戻る
sけいし発HPに戻る