PostgreSQLサーバの全データベース名を取得し配列に格納するシェルスクリプト

はじめに

QiitaでPostgreSQLのデータベースの名称をシェルスクリプトのリスト変数にセットする方法という記事を見つけたので、僕もやってみました。

検証環境

1
2
3
4
5
$ uname -moi
x86_64 MacBookPro11,4 Darwin

$ bash -version
GNU bash, バージョン 5.0.3(1)-release (x86_64-apple-darwin18.2.0)

準備

db_list.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env bash

declare -r DB_HOST="${1}"
declare -r DB_USER="${2}"
declare -r DB_PASS="${3}"

declare -a DB_NAME_LIST=$(
  PGPASSWORD="${DB_PASS}" psql \
    --tuples-only \
    --no-align \
    --username "$DB_USER" -h "$DB_HOST" \
    -c 'SELECT datname FROM pg_database'
)

# 動作確認
for DB_NAME in "${DB_NAME_LIST[@]}"; do
  echo "$DB_NAME"
done

解説

psql -l を使えば、DBの一覧は取得できるんですが、一部扱いにくい出力箇所があります。 ( template0 / template1 / postgres の3つの組み込みDB)

1
2
3
4
5
6
7
8
9
...
xxxxxxx                 | postgres                      | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
template0               | postgres                      | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
                        |                               |                  |             |                   | postgres=CTc/postgres
template1               | postgres                      | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
                        |                               |                  |             |                   | postgres=CTc/postgres
yyyyyyy                 | postgres                      | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
zzzzzzz                 | postgres                      | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
...

これに対応するためにカテゴリテーブルを直接見に行っています。

使い方

以下の3つのDBが格納されているサーバに対してスクリプトを実行

  • aaa
  • bbb
  • ccc
1
2
3
4
5
6
7
$ ./db_list.sh 10.2.3.4 'scott' 'norton'
aaa
bbb
ccc
template0
template1
postgres