注/更新(2021):この回答は機能します 、哲学的には、これを行う正しい方法はPostgresに質問するという他のコメントに同意します。 。
psql -c
を持つ他の回答があるかどうかを確認します または--command
それらの中には、ユースケースに適しています(例:Nicholas Grilly、Nathan Osman、bruce、Pedroのバリエーション
Arturoのソリューションの次の変更を使用します:
psql -lqt |カット-d\| -f 1 | grep -qw
機能
psql -l </ code> 次のようなものを出力します:
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+-----------+----------+------------+------------+-----------------------
my_db | my_user | UTF8 | en_US.UTF8 | en_US.UTF8 |
postgres | postgres | LATIN1 | en_US | en_US |
template0 | postgres | LATIN1 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | LATIN1 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
単純なアプローチを使用するということは、「リスト」、「アクセス」、または「行」と呼ばれるデータベースの検索が成功することを意味します。したがって、この出力を一連の組み込みコマンドラインツールにパイプして、最初の列のみを検索します。
>
-t
フラグはヘッダーとフッターを削除します:
my_db | my_user | UTF8 | en_US.UTF8 | en_US.UTF8 |
postgres | postgres | LATIN1 | en_US | en_US |
template0 | postgres | LATIN1 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | LATIN1 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
次のビット、 cut -d \ | -f 1
出力を垂直パイプ|
で分割します 文字(バックスラッシュでシェルからエスケープ)、フィールド1を選択します。これにより、次のようになります。
my_db
postgres
template0
template1
grep -w
単語全体に一致するため、 temp
を検索している場合は一致しません このシナリオでは。 -q
オプションは画面に書き込まれる出力を抑制します。したがって、コマンドプロンプトでこれをインタラクティブに実行する場合は、 -q
を除外することができます。 そのため、何かがすぐに表示されます。
grep -w
に注意してください 英数字、数字、およびアンダースコアに一致します。これは、postgresqlの引用符で囲まれていないデータベース名で許可されている文字のセットです(引用符で囲まれていない識別子ではハイフンは無効です)。他の文字を使用している場合は、 grep -w
うまくいきません。
このパイプライン全体の終了ステータスは0
になります (成功)データベースが存在する場合、または 1
(失敗)そうでない場合。シェルは特別な変数$?
を設定します 最後のコマンドの終了ステータスに移動します。条件付きでステータスを直接テストすることもできます:
if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
# database exists
# $? is 0
else
# ruh-roh
# $? is 1
fi