シェルスクリプトの使い方


[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
2.サンプル
--- ---
#(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
2.サンプル
---- ----
#(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に戻る
inserted by FC2 system