0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

シェルスクリプト&PowerShellAdvent Calendar 2023

Day 18

MySQLクエリの結果を外部ファイルへ出力するシェルスクリプトを作った

Posted at

はじめに

以下のコマンドを毎回手で打つのが面倒だったので、シェルスクリプトを作りました。

mysql -u user_name -p -h db_host_name db_name < fugafuga.sql 1> fugafuga.output 2> fugafuga.error

仕様

  • 引数で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

おわりに

シェルスクリプト作成にかえって時間がかかった気がしなくもないですが、勉強になりました。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?