sh 3

シェルスクリプトを書きます。
shを使います。shを使いましょう。

一連の作業の中で「ディレクトリが既に存在するか確認する」ということをshell scriptで実現する場合を考えます。

if statement

sample_003.sh

#! /bin/sh

dir_name=generated_dir

if [ ! -d ${dir_name} ]; then
    mkdir ${dir_name}
else
    echo ${dir_name}
    echo 'such directory exists'
    exit
fi

if 条件
! 否定
-d ファイルが存在して、それがディレクトリである
else 条件以外
fi ifを閉じる

下記はdir_nameという変数を作り、文字列generated_dirを入れるという操作を意味します。
dir_name=generated_dir

変数dir_nameは$dir_nameまたは${dir_name}として使うことが出来ます。

mkdirについては下記で説明しています。
ディレクトリを作成する

「UNIXにおいてディレクトリもファイルだ」ということについては下記を参照ください。
fileとdirectory

上述のshは下記から一部を抜粋して使いました。
7層のネットワークを動かす 1

実用に耐えるものを

sample_003.sh.practical

#! /bin/sh

# for test
date "+%Y_%m_%d_%H_%M"

# for test
# exit

dir_name=generated_dir_`date "+%Y_%m_%d_%H_%M"`

if [ ! -d ${dir_name} ]; then
    mkdir ${dir_name}
else
    echo ${dir_name}
    echo 'directory exists'
    exit
fi

dateコマンドはUNIXコマンドで現在の日時を出力します。上記で「分」までを出力させています。
dateコマンドは仕様がややこしいのでexitを使って期待の出力になるまで動作確認します。

sheel scriptの中では逆引用符で囲むと、UNIXコマンドを実行させてその結果を得ることが出来ます。
上記ではdateコマンドの結果を文字列として受けて、それを使っています。

ほとんどの人が使ったことがないと思われる逆引用符(back quote)ですが、このようにshell scriptでは非常に重要な責を担っています。

下記も利用すると、かなり便利になると思います。

-f ファイルが存在して、それがファイルである
-e ファイルが存在する(=ファイルでもいいし、ディレクトリでもいい)
string1 = string2 文字列string1と文字列string2が等しいか判定
string1 != string2 文字列string1と文字列string2が異なるか判定

まとめ

shell scriptの文法は丸暗記するものでもないと思っています。
例えば上記を雛形とすればshell scriptでif statementは書けるはずです。

大学生や若手がshell scriptを使わずに物凄い無駄を繰り返していることをまずはやめてもらいたいという思いがあります。
手作業の繰り返しと、それに誘発されるミスと、ミスした結果を使ってしまうこと、は無駄です。

bashでもcshでもありません。shです。shで書いたらみんな幸せです。
みんなで幸せになりましょう。

広告

IT開発関連書とビジネス書が豊富な翔泳社の通販『SEshop』
さくらのレンタルサーバ
ムームードメイン
Oisix(おいしっくす)
らでぃっしゅぼーや
珈琲きゃろっと
エプソムソルト




«       »
カテゴリーUNIX