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 $dstCode language: Bash (bash)

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

心配しすぎじゃない?

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

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

バッククォート `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 $dstCode language: Bash (bash)

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

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

$ DB_HOST = db123.example.jp
DB_HOST: コマンドが見つかりませんCode language: Bash (bash)

複数データベースを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.shCode language: Bash (bash)

main.sh

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

#!/bin/bash -ue

script_dir=$(cd $(dirname $0); pwd)
${script_dir}/db1.sh
${script_dir}/db2.shCode language: Bash (bash)

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

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

#!/bin/bash -ue

/home/users/1/yourname/cron/db1.sh
/home/users/1/yourname/cron/db2.shCode language: Bash (bash)

これなら意味わかるよ

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

/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.shCode language: Bash (bash)

今回は、変数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.shCode language: Bash (bash)

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 $dstCode language: Bash (bash)

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

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

$ ./mysqldump.sh
./mysqldump.sh: 行 3: DB_HOST: 未割り当ての変数ですCode language: Bash (bash)

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

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

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

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

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

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

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

企業サイトや人気サイトの運用実績多数!月額800円(税抜)~の高スペックレンタルサーバー
タイトルとURLをコピーしました