Arturo'nun çözümünde aşağıdaki değişikliği kullanıyorum:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Bu ne yapar
psql -l aşağıdaki gibi bir çıktı verir:
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)
Saf yaklaşımı kullanmak, "Liste," Erişim "veya" satırlar "adlı bir veritabanının aranmasının başarılı olacağı anlamına gelir. Bu nedenle, bu çıktıyı, yalnızca ilk sütunda arama yapmak için bir dizi yerleşik komut satırı aracıyla yönlendiririz.
-tBayrak üstbilgi ve altbilgi kaldırır:
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
Sonraki bit, cut -d \| -f 1çıktıyı dikey boru |karakteriyle böler (ters eğik çizgiyle kabuktan kaçtı) ve alan 1'i seçer. Bu,:
my_db
postgres
template0
template1
grep -wtam kelimelerle eşleşir ve bu nedenle, tempbu senaryoda arıyorsanız, eşleşmez . Bu -qseçenek, ekrana yazılan herhangi bir çıktıyı bastırır, bu nedenle bunu bir komut isteminde etkileşimli olarak çalıştırmak istiyorsanız, bir -qşeyin hemen görüntülenmesini sağlamak için onu dışlayabilirsiniz .
grep -wAlfasayısal, rakamlar ve alt çizgi ile eşleştiğini unutmayın; bu, tam olarak postgresql'deki alıntılanmamış veritabanı adlarında izin verilen karakter kümesidir (tireler tırnaksız tanımlayıcılarda geçerli değildir). Başka karakterler kullanıyorsanız, grep -wsizin için çalışmayacaktır.
Tüm bu ardışık düzenin çıkış durumu 0veritabanı varsa (başarılı) veya yoksa 1(başarısız) olacaktır. Kabuğunuz özel değişkeni $?son komutun çıkış durumuna ayarlayacaktır . Durumu doğrudan bir koşulda da test edebilirsiniz:
if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
# database exists
# $? is 0
else
# ruh-roh
# $? is 1
fi
... | grep 0, DB yoksa, kabuk dönüş değerini 0, varsa 1 yapmak için de ekleyebilirsiniz ; ya... | grep 1da tersi davranış için