bashシェルスクリプト入門その1

筆者がよく使うシェルスクリプトの処理をまとめました。

読み方

bashってどう読むのかな?

UNIX 用語 由来/読み方辞書 version 1.6 (Feb 13 1995)

筆者は「ビー・エー・シェル」と読んでいましたが、UNIX 用語 由来/読み方辞書によると「バッシュ」と読む人が多く、ついで「ビー・エー・シェル」だそうです。

日時ファイル名

"2020-04-14.log" みたいなことだね

mysqldumpしたファイル、バックアップファイル、ログファイルなどの場合、ファイル名に日時を含めることが多いです。

年月日時分秒をハイフンでつないで、2020-04-14-11-46-36。アンダースコアでつないで 2020_04_14_11_46_36 の場合。

# 2020-04-14-11-46-36 dst=$(date +%Y-%m-%d-%H-%M-%S) echo $dst # 2020_04_14_11_46_36 dst=$(date +%Y_%m_%d_%H_%M_%S) echo $dst

同じ秒のうちに、2回呼ぶと、同じファイル名ができてしまうよ。

心配しすぎじゃない?

そのような場合は、"%3N"を使って、ミリ秒まで指定します。

# 2020-04-14-11-46-36-123 dst=$(date +%Y-%m-%d-%H-%M-%S-%3N) echo $dst

バッククォート `date +%Y-%m-%d` と書いているところも多いけど?

同じ意味よ。
$()のほうを使ったほうがいいみたいね

mysqldumpするとき

db123.example.jp_my_wp_2014-04-14-12-15-53.sql のようなファイル名にmysqldumpする場合です。

#!/bin/bash -ue DB_HOST=db123.example.jp DB_NAME=my_wp DB_USER=my_wp DB_PASS=xxxxxxxx dst=${DB_HOST}_${DB_NAME}_$(date +%Y-%m-%d-%H-%M-%S).sql mysqldump --user=${DB_USER} --password=${DB_PASS} --host=${DB_HOST} ${DB_NAME} >$dst gzip $dst

イコール"="の左右に空白をつけたほうが、読みやすいと思って、
DB_HOST = db123.example.jp
と書いてみたけど、動かなかったよ?

はい、変数に値を設定するとき、イコール"="の左右に空白をつけてはいけません。

$ DB_HOST = db123.example.jp DB_HOST: コマンドが見つかりません

複数データベースをmysqldumpするとき

DB_HOSTなどの設定を別ファイルにして、mysqldumpとgzipの処理を1ファイルにまとめる場合です。

hetemlなら、/home/users/1/yourname/cronディレクトリを作るんだね。

そうよ。cron実行ファイルは、/home/users/1/yourname/cron/main.sh ね。

$ tree cron/ cron/ ├── db1.sh ├── db2.sh ├── main.sh └── mysqldump.sh

main.sh

最初に起動するファイルです。プログラムやスクリプトでは、mainをつけることが多いです。

#!/bin/bash -ue script_dir=$(cd $(dirname $0); pwd) ${script_dir}/db1.sh ${script_dir}/db2.sh

script_dirで何をやっているのか、よくわからないよ

script_dirを使わないなら、次のように書くこともできます。

#!/bin/bash -ue /home/users/1/yourname/cron/db1.sh /home/users/1/yourname/cron/db2.sh

これなら意味わかるよ

でも、他のサーバでも使いたいとき、コピペしやすいのはどちらかしら?

/home/users/1/yourname/cron の部分をサーバに合わせて編集しなきゃならないんだね!

db1.sh

#!/bin/bash -ue export DB_HOST=db123.example.jp export DB_NAME=db1 export DB_USER=db1 export DB_PASS=xxxxxxxx script_dir=$(cd $(dirname $0); pwd) ${script_dir}/mysqldump.sh

今回は、変数DB_HOSTの設定に、exportをつけます。

exportをつけない変数を、シェル変数といいます。シェル変数を使えるのは、このシェルスクリプト内だけです。呼び出し先のシェルスクリプト mysqldump.sh では、その変数を使えません。

exportをつけた変数は、環境変数といいます。呼び出し先のシェルスクリプト mysqldump.sh でも、変数DB_HOSTの値を使うことができます。

db2.sh

#!/bin/bash -ue export DB_HOST=db123.example.jp export DB_NAME=db2 export DB_USER=db2 export DB_PASS=xxxxxxxx script_dir=$(cd $(dirname $0); pwd) ${script_dir}/mysqldump.sh

main.shはターミナルで実行可能ですが、db1.sh や db2.sh もターミナルで実行可能です。

mysqldump.sh

#!/bin/bash -ue dst=${DB_HOST}_${DB_NAME}_$(date +%Y-%m-%d-%H-%M-%S).sql mysqldump --user=${DB_USER} --password=${DB_PASS} --host=${DB_HOST} ${DB_NAME} >$dst gzip $dst

呼び出し元でexportした変数DB_HOSTをmysqldump.sh内で使っています。

ターミナルでmysqldump.shを実行すると、DB_HOSTが未設定なので、エラー終了します。

$ ./mysqldump.sh ./mysqldump.sh: 行 3: DB_HOST: 未割り当ての変数です

変数名の大文字小文字って意味あるのかな?

変数名の大文字、小文字は区別されます。変数 x と 変数 X は違う変数です。

大文字の変数名と小文字の変数名があるんだけど、使い分けているのかな?

伝統的に、exportする変数は、全て大文字のアンダーバーつなぎ(スネークケース)です。

ターミナルで env を実行すると、export変数の一覧が表示されます。全て小文字やキャメルケースの変数はありません。

exportしない変数は、全て大文字のスネークケース、全て小文字のスネークケース、どちらでもいいと思います。

筆者は、全て小文字にすることもありますが、変数が目立たない感じがして、全て大文字にすることもあります。

タイトルとURLをコピーしました