2010.03.26
はじめてのシェルスクリプト
エンジニアなら誰しも一度は、
- DBのバックアップを定期的に取って、特定のストレージに保存したい
- 特定のフォルダに生成される一時ファイルを定期的に消したい
- ユーザ追加の際の諸々の作業を自動化したい
なんてことを考えたことがあるのではないでしょうか。
こんなときに役立つのが【シェルスクリプト】なわけですが、その他のプログラミング言語とは書き方が若干異なるため、少しとっつきにくさを感じる方もいらっしゃるのではないでしょうか。
そんなわけで、シェルスクリプトの基本の基本を書いてみました。
事前準備
シェルスクリプトを書く際に、まず必要なのは次の2つです。
- ファイルの1行目に使用するシェルを指定する
- ファイルに実行権限を与える
#!/bin/sh
という、よくある「あまじない」ですね。/bin/bash でも、/bin/zsh とかでもOKですが、そのシェルがインストールされている必要があります。
これは結構忘れがちです。シェルスクリプトの実行ユーザが実行できるように権限を設定してあげる必要があります。
変数
次に変数を扱う場合です。いくつかあるので、順番に紹介していきます。
- 変数をセットする場合はスペースを空けない
- セットには記号不要。呼び出しには$
- コマンドの実行結果を値に入れたいときはバッククオートを使う
- 変数と文字列をつなげる場合には記号は不要
他のプログラミング言語だと、ツメツメで書いた日には「コーディングのいろはも知らないのか」と怒られそうですが、シェルスクリプトはスペースを入れてはいけません。
○ foo=hoge
× foo = hoge
変数をセットする際には記号は必要ありませんが呼び出す時には$をつける必要があります。
foo=hoge
echo $foo
>>hoge
echo foo
>>foo
例えば、ファイル名に日付を指定したくて、dateコマンドの実行結果を入れたい場合などに使います。
FILENAME=`date +%Y%m%d_%H%M%s`
echo $FILENAME
>>20100326_175030
シングルクオートやダブルクオートだと、ただの文字列として扱われてしまうので要注意です。
PHPだと「.」をJavaScriptだと「+」を使うと思いますが、シェルスクリプトでは必要ありません。
foo=hoge
bar=piyo
echo /$foo/$bar/fuga
>>/hoge/piyo/fuga
何も考えず繋げればOKです。
特殊な変数
シェルスクリプトにはじめから用意されている変数を紹介していきます。
- $#:実行時に渡された引数の個数
- $1,$2,…$n:n番目の引数
- $?:直前の終了ステータス
シェルスクリプトを実行したときに渡された引数の個数を返します。
上に似ていますが、個数ではなく、n番目の引数そのものを返します。
sh ./foo.sh hoge fuga
echo $1
>>hoge
echo $2
>>fuga
となるわけです。
コマンド成功時には0、失敗時には1が返ってきます
host s-cubism.jp > /dev/null
echo $?
>> 0
host aaaaaaa > /dev/null
echo $?
>>1
これを取得して処理を分岐させたり、ループを抜けたり、といろいろな使い方ができます。
演算
シェルスクリプトの大きな特徴のひとつだと思いますが、基本的に入力したものは全て文字列だと判断します。
そのため、数値演算をさせる際には一手間必要です。
- 普通に数字を書くと、文字列として扱われます
- 数値を扱うにはバッククオートと”expr”を使います
foo=5
bar=3
echo $foo+$bar
>>5+3
foo=5
bar=3
echo `expr $foo + $bar`
>>8
で、このとき注意しなければいけないのが、$fooと+と$barの間にスペースを入れてあげることです。これで”+”が文字ではなくて、演算記号だと判断してくれます。
(入れてあげないと、上と同じく”5+3”が返ってきます)
ちなみに演算記号は他の言語と同じように、「+」「-」などが使えるのですが、掛け算だけは「*」ではなく「\*」としなければならないので注意してください。
制御文
if文とかcase文の説明に入る前に、制御文で使われる演算記号について説明しておきます。
他の言語であれば、「=」とか「>」とかを使うところですが、シェルスクリプトでは一切使えません。以下のようになっています。
| 大抵のプログラム言語 | シェルスクリプト |
| = | -eq |
| != | -ne |
| > | -gt |
| < | -lt |
| >= | -ge |
| <= | -le |
他にも以下のようなものがあります。
| 真になる条件 | コマンド |
| ディレクトリ | -d |
| ファイル | -f |
| 読み取り可能 | -r |
| 書き込み可能 | -w |
| 実行可能 | -x |
| 存在する | -e |
| サイズが0より大きい | -s |
例えば、
-f foo で、fooがファイルであれば、真となるわけです。
制御文~ifとかcaseとか~
シェルスクリプトも他の言語と同じようにifとかforとかwhileとかが使えるのですが、今回はだいぶ長くなってきたので、登場頻度の高いifとcaseだけを紹介します。
- if文
- case文
こんな感じです
if [ -e foo ]
then
baz=hoge
elif [ -e bar ]
then
baz=piyo
else
baz=fuga
fi
ポイントは”then”と”fi”でしょうか。この2つを忘れると、動いてくれません。
case $1 in
start)
echo “start”
;;
stop)
echo “stop”
;;
*)
echo “[start|stop]”
;;
esac
ちょっとわかりづらいかもしれませんが、一番上の$1で実行時に渡された引数を取得しています。
それが”start”であれば一番上、”stop”であれば真ん中、それ以外であれば一番下の処理が実行されます。
これもセミコロン2つや一番最後のesacを忘れると動かないので要注意です。
さいごに
基本部分だけを駆け足で説明してきましたが、これだけでもそこそこの処理は書けるのではないでしょうか。
それでは良きサーバーライフをお送りください!
Trackback URL
Comment & Trackback
Comment feed
Comment