« PHPの正規表現で注意したい5つのこと | Dojo Toolkitを使ってみる »

2010.03.26

はじめてのシェルスクリプト

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをnewsingに追加

エンジニアなら誰しも一度は、

  • DBのバックアップを定期的に取って、特定のストレージに保存したい
  • 特定のフォルダに生成される一時ファイルを定期的に消したい
  • ユーザ追加の際の諸々の作業を自動化したい

なんてことを考えたことがあるのではないでしょうか。

こんなときに役立つのが【シェルスクリプト】なわけですが、その他のプログラミング言語とは書き方が若干異なるため、少しとっつきにくさを感じる方もいらっしゃるのではないでしょうか。

そんなわけで、シェルスクリプトの基本の基本を書いてみました。

事前準備

シェルスクリプトを書く際に、まず必要なのは次の2つです。

  1. ファイルの1行目に使用するシェルを指定する
  2. #!/bin/sh

    という、よくある「あまじない」ですね。/bin/bash でも、/bin/zsh とかでもOKですが、そのシェルがインストールされている必要があります。

  3. ファイルに実行権限を与える
  4. これは結構忘れがちです。シェルスクリプトの実行ユーザが実行できるように権限を設定してあげる必要があります。

変数

次に変数を扱う場合です。いくつかあるので、順番に紹介していきます。

  1. 変数をセットする場合はスペースを空けない
  2. 他のプログラミング言語だと、ツメツメで書いた日には「コーディングのいろはも知らないのか」と怒られそうですが、シェルスクリプトはスペースを入れてはいけません。

    ○ foo=hoge
    × foo = hoge

  3. セットには記号不要。呼び出しには$
  4. 変数をセットする際には記号は必要ありませんが呼び出す時には$をつける必要があります。

    foo=hoge
    echo $foo
    >>hoge
    echo foo
    >>foo

  5. コマンドの実行結果を値に入れたいときはバッククオートを使う
  6. 例えば、ファイル名に日付を指定したくて、dateコマンドの実行結果を入れたい場合などに使います。

    FILENAME=`date +%Y%m%d_%H%M%s`
    echo $FILENAME
    >>20100326_175030

    シングルクオートやダブルクオートだと、ただの文字列として扱われてしまうので要注意です。

  7. 変数と文字列をつなげる場合には記号は不要
  8. PHPだと「.」をJavaScriptだと「+」を使うと思いますが、シェルスクリプトでは必要ありません。

    foo=hoge
    bar=piyo
    echo /$foo/$bar/fuga
    >>/hoge/piyo/fuga

    何も考えず繋げればOKです。

特殊な変数

シェルスクリプトにはじめから用意されている変数を紹介していきます。

  1. $#:実行時に渡された引数の個数
  2. シェルスクリプトを実行したときに渡された引数の個数を返します。

  3. $1,$2,…$n:n番目の引数
  4. 上に似ていますが、個数ではなく、n番目の引数そのものを返します。

    sh ./foo.sh hoge fuga

    echo $1
    >>hoge
    echo $2
    >>fuga

    となるわけです。

  5. $?:直前の終了ステータス
  6. コマンド成功時には0、失敗時には1が返ってきます

    host s-cubism.jp > /dev/null
    echo $?
    >> 0
    host aaaaaaa > /dev/null
    echo $?
    >>1

    これを取得して処理を分岐させたり、ループを抜けたり、といろいろな使い方ができます。

演算

シェルスクリプトの大きな特徴のひとつだと思いますが、基本的に入力したものは全て文字列だと判断します。
そのため、数値演算をさせる際には一手間必要です。

  • 普通に数字を書くと、文字列として扱われます
  • foo=5
    bar=3
    echo $foo+$bar
    >>5+3

  • 数値を扱うにはバッククオートと”expr”を使います
  • 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文
  • こんな感じです

    if [ -e foo ]
    then
      baz=hoge
    elif [ -e bar ]
    then
      baz=piyo
    else
      baz=fuga
    fi

    ポイントは”then”と”fi”でしょうか。この2つを忘れると、動いてくれません。

  • case文
  • case $1 in
      start)
        echo “start”
      ;;
      stop)
        echo “stop”
      ;;
      *)
        echo “[start|stop]”
      ;;
    esac

    ちょっとわかりづらいかもしれませんが、一番上の$1で実行時に渡された引数を取得しています。
    それが”start”であれば一番上、”stop”であれば真ん中、それ以外であれば一番下の処理が実行されます。

    これもセミコロン2つや一番最後のesacを忘れると動かないので要注意です。

さいごに

基本部分だけを駆け足で説明してきましたが、これだけでもそこそこの処理は書けるのではないでしょうか。

それでは良きサーバーライフをお送りください!

Trackback URL

Comment & Trackback

No comments.

Comment feed

Comment





XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>