シェルスクリプト


書き方
変数
特殊な変数
コマンド置換
エスケープシーケンスと文字列連結
四則演算
制御構文 - if、for、while、case -
条件の評価
関数の使用

ほとんど引用。

書き方

シェルスクリプトの書き方
シェルスクリプトの書き方
#!`シェルプログラムパス` 実行するコマンド ...

シェルスクリプト例
#!/bin/bash echo hello

コメントを入れる
- 行頭に「#」をつける
コメントを入れる例
1: #!/usr/bin/sh 2: # ここはコメントです。 3: echo "これはスクリプト本体です。"

行の途中で改行する
- 改行する直前に「\」を入れる。
行の途中で改行する例
1: #!/usr/bin/sh 2: echo "これはシェルスクリプトです。\ 3: 途中で改行したくなっちゃいました。"

>>Topへ

変数

変数名に使える文字
- 英数字と「 _ 」(アンダーバー)のみで、必ず英数字ではじめる
変数の代入
- 変数名=値

値の参照
- $変数名 or ${変数名} or "$変数名"

注意点
- 代入コマンド「=」の前後にスペースを入れない
- 空白、タブ、改行などを含んだ値を代入するには、値を引用符で囲む。
- 値の代入されていない変数は空文字となる。
- 変数参照時に変数が誤解釈されそうな場合には「""」または「{ }」で変数名を囲む。
>>Topへ

特殊な変数

$?最後に実行したコマンドのexit値
$$シェル自身のプロセスID
$!シェルが最後に起動したバックグラウンドプロセスのプロセスID
$-シェルの起動時のフラグ、setコマンドを使って設定したフラグの一覧
$nスクリプトに渡された n番目の引数 (9個まで引数を取れる。
$0はスクリプトの名前、 $1は第1引数、…、$9は第9引数)
$#シェルに対する引数の個数(引数がない場合は0)
$*全引数リスト。ダブルクォートで囲んだ場合、"$1 $2 … $n" と全引数を一つにくっつけた物に展開される。
$@全引数リスト。ダブルクォートで囲んだ場合、"$1" "$2" … "$n" とそれぞれの引数を個別にダブルクォートで囲んで展開する。

>>Topへ

コマンド置換

>>Topへ コマンドラインやシェルスクリプト中でコマンドをバッククォーテーション ( ` ) で囲むと、
自動的にそのコマンドを実行した結果に置き換わります。
コマンド置換例
1: #!/usr/bin/sh 2: var=`date` 3: echo $var


エスケープシーケンスと文字列連結

に並べた文字は、シェルスクリプトでは特殊な文字として扱われ、そのままでは普通の文字として扱ってくれません。
; & ( ) | ^ < > ? * [ ] $ ` " ' { } [TAB] [SPACE]

これらを普通の文字として扱うためには、適当にエスケープする必要があります。

特殊文字をエスケープするには次の3つが使われます。

バックスラッシュ( \ )により一文字エスケープ
シングルクォーテーション( ' )で囲む
ダブルクォーテーション( " )で囲む

バックスラッシュにより一文字エスケープ
バックスラッシュ ( \ ) の直後の特殊文字は普通の文字として扱われます。
シングルクォーテーションで囲む
シングルクォーテーション ( ' ) で囲まれた中の特殊文字はすべて普通の文字として扱われます。

ダブルクォーテーション ( " ) で囲む
ダブルクォーテーションで囲まれた中の特殊文字は $ ` \ を除いてすべて普通の文字として扱われます。
つまり、ダブルクォーテーション中では 変数、コマンド置換 が行われます。
これが、シングルとダブルのクォーテーションの意味の違いです。

>>Topへ

四則演算

シェルスクリプトでは、変数は文字列として扱われます。
そのため、ほかの言語のように単純に + や - 演算子を使うことができません。
シェルスクリプトで数値計算をするには expr というコマンドを使用します。
数値演算コマンド exprで使う演算子
加算+
減算-
乗算\*
除算/
剰余%

四則演算例
1: #!/usr/bin/sh 2: echo "8 + 4 = `expr 8 + 4`" 3: echo "8 - 4 = `expr 8 - 4`" 4: echo "8 * 4 = `expr 8 \* 4`" 5: echo "8 / 4 = `expr 8 / 4`" 6: echo "8 % 4 = `expr 8 % 4`"


制御構文 - if、for、while、case -

>>Topへ if文
if文の書き方
if 条件; then
     コマンド
     .....
elif
     コマンド
     .....
else
     コマンド
     .....
fi

if文の例
1: #!/usr/bin/sh
2: if [ $1 = "argment" ]; then
3:      echo "引数はargmentです。"
4: elif [ $1 = "hikisu" ]; then
5:      echo "引数はhikisuです。"
6: else
7:      echo "なんか引数が渡りました。"
8: fi

for文
for文の書き方
for 変数 in リスト
do
     コマンド
done

for文例
1: #!/usr/bin/sh
2: for var in a b c d
3: do
4:     echo $var
5: done

while文
while文の書き方
while 条件
do
     コマンド
done

while文例
1: #!/usr/bin/sh
2: a=1
3: while [ a -lt 3 ]
3: do
4:     echo "a = $a"
5:     a=`expr $a + 1`
6: done

case文
case文の書き方
case 変数 in
     パターン1) コマンド;;
     パターン2) コマンド;;
     パターン3) コマンド;;
esac

case文例
1: #!/usr/bin/sh
2: case $1 in
3:     A) echo "引数はAです。";;
4:     B) echo "Bが引数につけられました。";;
5:     C) echo "Cは引数です。";;
6: esac


条件の評価

文字列比較演算子
=両辺の文字列が一致したとき真
!=両辺の文字列が一致しないとき真
-n変数 変数がnullでないときに真
-z変数 変数がnullのときに真

ファイル属性演算子
-d filefileが存在してディレクトリのとき真
-e filefileが存在するとき真
-f fileファイルが存在し普通のファイルのとき真

論理演算子
-aかつ
-oまたは

数値評価演算子
-ltより小さい
-le以上
-eq等しい
-ge以上
-gtより大きい
-ne等しくない


条件の評価例
1: #!/usr/bin/sh
2: if [ -n $1 ]; then
3:    echo "なんか引数がついています。"
4: fi
5: if [ $1 -gt 10 ]; then
6:    echo "10より大きい数字みたいです。"
7: fi

>>Topへ

関数の使用

関数の書き方
関数名() {
     コマンド
     .....
}

関数例
1: #!/usr/bin/sh
2: func() {
3:      echo "関数の中です。"
4:      echo "引数は $1 です。"
5: }
5:
6: func arg1

>>Topへ

参考資料

シェルスクリプト リファレンス & Tipsから引用

>>Topへ