Catatan/Pembaruan (2021):Sementara jawaban ini berfungsi , secara filosofis saya setuju dengan komentar lain bahwa cara yang tepat untuk melakukan ini adalah bertanya kepada Postgres .
Periksa apakah jawaban lain yang memiliki psql -c
atau --command
di dalamnya lebih cocok untuk kasus penggunaan Anda (mis. Varian Nicholas Grilly, Nathan Osman, bruce, atau Pedro
Saya menggunakan modifikasi berikut dari solusi Arturo:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Apa fungsinya
psql -l
menghasilkan sesuatu seperti berikut:
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)
Menggunakan pendekatan naif berarti pencarian database yang disebut "Daftar, "Akses" atau "baris" akan berhasil. Jadi kami menyalurkan output ini melalui sekumpulan alat baris perintah bawaan untuk hanya mencari di kolom pertama.
-t
flag menghapus header dan footer:
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
Bit berikutnya, cut -d \| -f 1
membagi output dengan pipa vertikal |
karakter (lolos dari shell dengan garis miring terbalik), dan memilih bidang 1. Ini meninggalkan:
my_db
postgres
template0
template1
grep -w
cocok dengan seluruh kata, dan tidak akan cocok jika Anda mencari temp
dalam skenario ini. -q
opsi menekan output apa pun yang ditulis ke layar, jadi jika Anda ingin menjalankan ini secara interaktif pada prompt perintah, Anda dapat mengecualikan -q
jadi sesuatu segera ditampilkan.
Perhatikan bahwa grep -w
cocok dengan alfanumerik, angka, dan garis bawah, yang merupakan kumpulan karakter yang diizinkan dalam nama basis data yang tidak dikutip di postgresql (tanda hubung tidak sah dalam pengidentifikasi yang tidak dikutip). Jika Anda menggunakan karakter lain, grep -w
tidak akan bekerja untuk Anda.
Status keluar dari seluruh jalur pipa ini adalah 0
(berhasil) jika database ada atau 1
(gagal) jika tidak. Shell Anda akan mengatur variabel khusus $?
ke status keluar dari perintah terakhir. Anda juga dapat menguji status secara langsung dalam kondisi:
if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
# database exists
# $? is 0
else
# ruh-roh
# $? is 1
fi