नोट/अपडेट (2021):जबकि यह उत्तर काम करता है , दार्शनिक रूप से मैं अन्य टिप्पणियों से सहमत हूं कि ऐसा करने का सही तरीका है Postgres से पूछना ।
जांचें कि क्या अन्य उत्तरों में psql -c
. है या --command
उनमें आपके उपयोग के मामले के लिए बेहतर फिट हैं (जैसे निकोलस ग्रिली, नाथन उस्मान, ब्रूस या पेड्रो के संस्करण
मैं Arturo के समाधान के निम्नलिखित संशोधन का उपयोग करता हूं:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
यह क्या करता है
psql -l
निम्न की तरह कुछ आउटपुट करता है:
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
अल्फ़ान्यूमेरिक, अंक और अंडरस्कोर से मेल खाता है, जो कि पोस्टग्रेस्क्ल में गैर-उद्धृत डेटाबेस नामों में अनुमत वर्णों का सेट है (हाइफ़न गैर-उद्धृत पहचानकर्ताओं में कानूनी नहीं हैं)। यदि आप अन्य वर्णों का उपयोग कर रहे हैं, 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