Bash script tutorial

Bashを用いたシェルスクリプトのチュートリアルです。

最速でBashシェルスクリプトの基礎をマスターしてもらうことを目標にしたチュートリアルです。 以下のような内容を盛り込んだシェルスクリプトを題材に学習します。

  • 変数と特殊変数
  • 関数
  • 条件分岐
  • ループ
  • 入力待ちとキーボード入力

これだけ盛り込まれていれば、シェルスクリプトでよく必要になる基本的な事項をかなりカバーできるようになっています。 もちろんそれだけですべてではありませんが、あとは自分で調べながら目的に合ったシェルを作っていくことが出来ると思います。

シェルスクリプトとは?

そもそもシェルスクリプトとはなんでしょうか? 通常コンソールで操作するようなコマンドを実行したい順に記述したテキストファイルです。 テキストファイルに処理を順に記述しておくことで一括で実行することが出来ます。このようなテキストファイルをShellスクリプトと呼びます。

シェルスクリプトを構成するテキストファイルには決まったフォーマットというかお作法があります。 以下が基本のフォーマットです。

#!/bin/bash
(処理の記述)
exit 0

先頭行はこのスクリプトがbashで実行されることを宣言しています。最終行のexitは明示的にスクリプトが完了したことを表しています。

「処理の記述」部分にOSに指示したい内容を書いていくことでシェルプログラミングができます。 もっとも簡単なスクリプトは、以下のように、ただ実行したいコマンドを順に書いただけのものです。

#!/bin/bash
echo "hello world"
echo "bye world"
exit 0

たとえば、上記のechoの部分を以下のように変更するだけで、簡単なバックアップスクリプトが作れます。

  • このコマンドをディレクトリを作る(mkdirコマンドなど)
  • 必要なファイルをディレクトリにコピーする(cpコマンドなど)
  • 圧縮する(tarコマンドなど)
  • 不要なファイルを削除する(rmコマンドなど)
  • バックアップサーバに転送する(scpなど)

こういった一連の処理をまとめてシェルスクリプトにしておくだけで、シェルスクリプト一つ起動するだけで面倒な作業を完了したり、オペレーションミスを減らしたり、といった効果が生まれます。日ごろからよく行う作業などはシェルスクリプト化しておくというのはサーバ運用の基本になります。

題材

本チュートリアルでは以下のスクリプトを題材に進めていきます。

#!/bin/bash

function usage() {
    message=`cat <<EOF

About this script:
    Backup script for files
Usage:
    ${0} targent_file_name [backup_file_name]
    target_file_name : file to backup
    backup_file_name : backup file name
                       default file_name is date and time based file_name
                       yyyymmddhhmmss.tgz like 20140101000000.tgz
EOF
`
    echo "${message}"
    return 0
}

function die() {
    if [ $# -eq 1 ] ; then
        echo "ERROR : ${1}"
    else
        echo "ERROR : unknow error"
    fi
    usage
    exit 1
}

if [ $# -lt 1 ]; then
    die "missing target file name"
fi

if [ -e $1 ]; then
    target_file_name=$1
else
    die "target file ${1} that you specified does not exists."
fi

if [ $2 ]; then
    if [ -e $2 ]; then
        die "backup file ${2} already exists"
    else
        backup_file_name=$2
    fi
else
    backup_file_name=`date +%Y%m%d%H%M%S`.tgz
fi

echo -n "backup ${target_file_name} to ${backup_file_name} ? [yes/no] : "
while read confirmation; do
    case $confirmation in
        'yes' ) tar zcf ${backup_file_name} ${target_file_name}
            break ;;
        'no' ) echo "stopped operation"
            exit 0 ;;
        *) echo "unknown option. try again."
            echo -n "backup ${target_file_name} to ${backup_file_name} ? [yes/no] : " ;;
    esac
done

if [ $? -eq 0 ] ; then
    exit 0
else
    exit 1
fi

スクリプトファイル

シェルスクリプトのファイル名に特にルールはありませんが、慣習的にxxx.shのように拡張子を.shにして、シェルスクリプトであることを明示することが多いです。 また、シェルスクリプトのファイルには実行するユーザに対する実行権限が必要です。 上記題材のスクリプトをテキストファイルに記載して、実行権限をつけておいて動作を試しながら以降を読み進めてもらえるとよいと思います。

while(1) if(1) case(1) exit(1) read(1) scripting(4) then(1) elif(1) else(1) function(1) return(1) EOF(1) shebang(1)
bash(4)