はじめに
以下のコマンドを毎回手で打つのが面倒だったので、シェルスクリプトを作りました。
mysql -u user_name -p -h db_host_name db_name < fugafuga.sql 1> fugafuga.output 2> fugafuga.error
仕様
- 引数でsqlのファイル名を受け取る
- sqlファイル名・標準出力ファイル名・標準エラー出力ファイル名は、
.拡張子
以外は同一とする
- sqlファイル名・標準出力ファイル名・標準エラー出力ファイル名は、
- パスワードはファイルに書かず、別途手で入力する
作成したシェルスクリプト
execute_sql.sh
#!/bin/bash
if [ "$#" -ne 1 ]; then
echo "Usage: $0 needs a sql file name (example: fugafuga.sql)"
exit 1
fi
BASENAME="${1%.sql}"
DB_USER="user_name"
DB_HOST="db_host_name"
DB_NAME="db_name"
read -s -p "Enter MySQL password for user $DB_USER: " DB_PASSWORD
echo
mysql -u $DB_USER -p$DB_PASSWORD -h $DB_HOST $DB_NAME < "${BASENAME}.sql" > "${BASENAME}.output" 2> "${BASENAME}.error"
解説
コマンドライン引数の数が1でなかったらエラーを出す
-
$#
が引数の数if [ "$#" -ne 1 ]; then echo "Usage: $0 needs a sql file name (example: fugafuga.sql)" exit 1 fi
受け取ったファイル名から「.sql」を削除
-
${word%suffix}
で、wordからsuffixを削除 -
$1
は引数BASENAME="${1%.sql}"
readコマンドでキーボードからの入力を受け取る
-
-s
は読み込んだ文字を画面に表示しない -
-p
は読み込み前に文字列を表示 -
入力された文字列を
DB_PASSWORD
に代入read -s -p "Enter MySQL password for user $DB_USER: " DB_PASSWORD
mysqlコマンドを実行
-
"${BASENAME}.sql"
のようにダブルクォーテーションで囲む-
ファイル名に空白があったとしても1つのファイル名として正しく変数展開される
mysql -u $DB_USER -p$DB_PASSWORD -h $DB_HOST $DB_NAME < "${BASENAME}.sql" > "${BASENAME}.output" 2> "${BASENAME}.error"
-
実行
$ ./execute_sql.sh fugafuga.sql
おわりに
シェルスクリプト作成にかえって時間がかかった気がしなくもないですが、勉強になりました。
参考