ショッパーズ

InfoTech

シェルスクリプト


コマンドを処理する順番に並べ、自動的に処理を行う。



[例] シェルスクリプトの書き方

----------------------
echo "Hello World!"
----------------------
エディタで書き込んで test.sh で保存します。
拡張子は .sh で無くても構わない。 (無くてもよい)

作成したファイルに実行権限を付与します。
chmod +x test.sh

実行します。
./test.sh


[例] リダイレクト

----------------------
less <<EOF
Hello World!
EOF
----------------------

実行するとlessが起動して <<EOF と EOF の間の文が表示されます。

メモ:lessはqキーで終了します。


[例] 条件分岐 if

----------------------
count=2 # コメント

if [ $count -eq 1 ]; then
echo "count = 1"
elif [ $count -eq 2 ]; then
echo "count = 2"
else
echo "count error!"
fi
----------------------

実行すると "count = 2" が表示されます。
1行目を count=1 にすれば "count = 1" が表示されます。
さらに、1と2以外にすれば "count error!" が表示されます。

count=数値 の部分は空白などを入れずに連続して書いてください。

メモ:
スクリプト中の # から行末まではコメントになります。(bash)


if文は条件が「真」になる部分が実行されます。

if [条件式]; then
条件式が一致したときに実行する内容
elif [条件式2]; then
条件式2が一致したときに実行する内容
else
一致する条件式が無い場合に実行する内容
fi

elif と else は無くても構いません。(if, then, fi は必須)

メモ:
条件式を [ ] で囲むのは [] が test コマンドのエイリアスになっている為。
普通に書くと "if test $count -eq 1 ; then" となる所の test 部分が "[" になっている。

メモ:条件判定式について
-eq 等しい (equal)
-ne 等しくない (not equal)
-lt 小さい (less than)
-le 小さいまたは等しい (less than or equal)
-gt 大きい (greater than)
-ge 大きいまたは等しい (greater than or equal)


[例] 条件分岐 case

----------------------
word="one"

case $word in
"one")
echo "word = 1"
;;
"two")
echo "word = 2"
;;
*)
echo "word = ?"
esac
----------------------

実行すると "word = 1" が表示されます。
word="two" にして実行すると "word = 2" が表示されます。
one,two 以外にして実行すると "word = ?" が表示されます。


処理内容の解説
----------------------
count=1 # 変数 count に 1 を入れる

case $count in # $count の中に
1) # 1 が入っている時は
echo "count = 1" # ここの処理を実行
;; # 条件該当時の実行文の終了
2)
echo "count = 2"
;;
*) # 何れの条件式にも一致しない
echo "count = ?"
esac
----------------------

実行すると "count = 1" になります。


[例] 日付をフォーマットして出力する

----------------------
echo `date '+%Y/%m/%d %H:%M:%S'`
----------------------

実行すると "2005/08/25 10:10:10" などが表示されます。


[例] ループ処理 while

----------------------
i=0
while [ $i -lt 5 ]; do # 条件式が真の間、繰り返す
echo "i = $i" # 表示
i=`expr $i + 1` # expr コマンドを利用して加算する
done # 条件まで戻る
----------------------

実行結果
i = 0
i = 1
i = 2
i = 3
i = 4


[例] ループ処理 for

----------------------
for name in umi yama kawa ; do
echo $name
done
----------------------

実行結果
umi
yama
kawa

変数 name に対して in の後の文字列を入れながらループする。


[例] 引数を読み込む

----------------------
echo "FileName = $0"
echo " Count = $#"
echo ""
echo "$1 , $2 , $3"
----------------------
test.sh で保存した後

「 ./test.sh umi yama kawa 」とタイプインして実行します。

実行結果
FileName = ./test.sh
Count = 3

umi , yama , kawa


引数は $1 $2 $3 ... の順で変数に格納されています。
$0 は、スクリプトのファイル名が入ります。
$# は、渡された引数の項目数が入ります。

引数の数が 10 を超えるときは、中括弧を付けて ${10} ${11} と記述します。


[例] 引数が存在するか否か判定する

----------------------
if [ -n "$1" ]; then
echo "OK!"
else
echo "NG!"
fi
----------------------

引数を付けて実行すれば "OK!"
何もつけずに実行すれば "NG!"
が、表示されます。

メモ: "-n" 文字列が存在すれば真を返します。


[例] 変数の基礎

----------------------
x=100
q="aiueo"
echo "x = $x"
echo "q = $q"
----------------------

実行結果
x = 100
q = aiueo

変数に値を入れるときは...

"変数名=値" で宣言します。スペースを入れると認識されません。

変数から値を取り出すときは...

"$変数名" で取り出します。


[例] expr の操作方法

シェルスクリプトでは expr プログラムを利用して演算する。
数値と演算子の間には必ず半角スペースを入れる。
乗算、除算は演算子を '' で囲む必要がある。

「四則演算」
加算: expr 30 + 20 -> 50
減算: expr 30 - 20 -> 10
乗算: expr 30 '*' 20 -> 6000
除算: expr 30 '/' 20 -> 1
(余りは切り捨て)