この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
はじめに
サーバ内部でバックアップを取るなど、特定の決まった作業をコマンドで打ち続けるとだんだん面倒になることがあります。こういう時は自動で作業するよう組みたくなるものです。
また、定期的ではないものの、よくやる一連の作業をいちいち入力するのも面倒ですね。なんとかしたいものです。
そこでシェルスクリプトというものが登場します。このシェルに普段入力しているコマンドを記述し、実行すれば、記述したコマンドを順々に実行してくれます。
今回はこのシェルに関しての話で触り始めて学んだことや思ったことを紹介していきます。
※ほとんどコマンドを触ったことのない人は迂闊に触らないほうがいいと思います。また、場合によってはファイルの消失や上書き等取り返しのつかないことが発生するコマンドもあるので、なるべく実行環境とは別の、構造が似た様な環境を構築してそちらでテストを行ってから実行環境に反映させることを推奨します。(コピー、削除等)
まずは書く
実行環境:CentOS5.9
helloWorld.sh
#!/bin/bash
echo ‘Hello!’
echo ‘Shell world!’
ただecho
で2行表示するだけの簡単なシェルです。bash以外にsh等もあるようですが、環境によって動作が異なる部分があるようなのと、bashで見かけるソースが多かったので、こちらで記載していきます。
結果
確かに表示されました。
これで普段実行されているコマンドを書いていけばいいですね!
そこまで甘くない
シェルと同じディレクトリで実行する想定で記述したと仮定します。
実行は同じディレクトリからと、別のディレクトリからの両方を行います。
passCheck.sh
#!/bin/bash
echo '=== pass check ==='
pwd
echo '=== move ==='
cd Desktop
pwd
echo '=== end ==='
結果
pwd
で確認したパスが変化しています。「shファイルと同じディレクトリに移動して実行しないと動かない」ルールで行えば、一応問題ありません(ミスをおこしかねないのでお勧めしません)が、今回のようにDesktopフォルダに移動してから実行すると、パスが変化するため、エラーが発生してしまいます。
今回はpwd
で自身の位置を確認し、cd
で移動するコマンドだけなので影響はありませんが、場合によっては実行されなかったり、想定外の事態が起こったりします。
さて画像から分かるかもしれませんが、実行時にディレクトリの移動を行っても、シェルの終了時に元の位置に戻されます。
対応としては、
・少なくとも最初のcd
は絶対パスで記述する
あくまで「少なくとも」です。なるべくフォルダ移動の際は絶対パスの方がいいのではと思いますし、コピーコマンド等も、こだわりがなければその方がいい気がします。
cd
のパス指定ですが、シェルと同じ位置に行く場合はdirname $0
を利用した方法があります。ただ、実行およびソースの書き方によっては、期待する処理と結果が異なります。(参考:dirname $0 でスクリプト置いてあるディレクトリにならない 1年以上前の記事ですが同様の動作を確認)$0
ですが、これは初期値ではシェル自身のパスが格納されています。(〜.shの形)
終わりに
今回は触り始めになるだろう部分を紹介してみました。まだ紹介していませんが、if文や変数なども使用できます。これらを利用して処理を分けたり弾いたりできますが、後に簡単なもので紹介しようと思います。