2009-10-28 11 views
31

में मुझे डेटाबेस से पुनर्प्राप्त परिणामों को पकड़ने के लिए एक चर की आवश्यकता है। अभी तक यह मूल रूप से मैं बिना किसी सफलता के प्रयास कर रहा हूं।बैश स्क्रिप्ट - डेटाबेस से परिवर्तनीय

myvariable=$(mysql database -u $user -p $password | SELECT A, B, C FROM table_a) 

बैश आदेशों की मेरी समझ बहुत अच्छी नहीं है जैसा आप देख सकते हैं।

उत्तर

33

मैं MySQL कमांड लाइन इंटरफेस के बारे में ज्यादा पता नहीं है, लेकिन यह सोचते हैं आप केवल कोसने के साथ मदद की जरूरत है, तो आप की कोशिश करनी चाहिए या तो की तरह चारों ओर आदेशों स्वैप:

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p$password) 

जो स्ट्रिंग echos MySQL में। या, आप अधिक फैंसी हो सकता है और कुछ नए बैश-सुविधाओं (यहाँ स्ट्रिंग)

myvariable=$(mysql database -u $user -p$password<<<"SELECT A, B, C FROM table_a") 

एक ही बात है, जिसके परिणामस्वरूप (आप हाल ही में काफी बैश संस्करण का उपयोग कर रहे हैं यह सोचते हैं) का उपयोग गूंज से जुड़े बिना कर सकते हैं।

कृपया ध्यान दें कि -p $ पासवर्ड एक टाइपो नहीं है, लेकिन जिस तरह से MySQL कमांड लाइन के माध्यम से पासवर्ड को दर्ज करने की अपेक्षा करता है (विकल्प और मूल्य के बीच कोई स्थान नहीं)।

ध्यान दें कि MyVQL में सब कुछ शामिल होगा जो MySQL मानक आउट (आमतौर पर सबकुछ लेकिन त्रुटि संदेशों) पर आउटपुट करता है, जिसमें किसी भी और सभी कॉलम हेडर, ASCII-art फ्रेम और अन्य शामिल हैं, जो आप चाहते हैं या नहीं भी हो सकते हैं।

संपादित करें:
के रूप में उल्लेख किया गया है, वहाँ MySQL करने के लिए एक -e पैरामीटर प्रतीत होता है, मुझे लगता है कि एक के लिए निश्चित रूप से जाना चाहते हैं,।

+0

पर mysql क्लाइंट स्थापित करने की आवश्यकता है धन्यवाद, mysql कमांड को भी पसंद नहीं आया .. मुझे --password = $ पासवर्ड का उपयोग करने की आवश्यकता है। – imnotneo

+1

आप अपने होम फोल्डर में कॉन्फ़िगरेशन फ़ाइल (.my.cnf कहा जाता है) भी जोड़ सकते हैं जो आपके विकल्पों को स्वचालित रूप से प्लग करेगा। इससे आपकी स्क्रिप्ट – Yitzchak

+0

+1 .my.cnf में कुछ भ्रम बचाएगा - खासकर स्क्रिप्ट से पासवर्ड प्राप्त करने के लिए। -N विकल्प फ़ील्ड नामों को ट्रिम करने के लिए उपयोगी है। – ErichBSchulz

12

आप पाइप दूसरी तरह के आसपास है और आप, क्वेरी गूंज करने की जरूरत है इस तरह: (

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql db -u $user -p $password) 

एक अन्य विकल्प इस

myvariable=$(mysql db -u $user -p $password -se "SELECT A, B, C FROM table_a") 

की तरह, सिर्फ mysql ग्राहक का उपयोग करने के लिए है -s को ASCII-art से बचने के लिए आवश्यक है)

अब, इस प्रकार के परिदृश्यों को संभालने के लिए बाश सबसे उपयुक्त भाषा नहीं है, विशेष रूप से तारों को संभालने के लिए एसएनएल परिणाम और इसी तरह विभाजित। पर्ल, पायथन या PHP में बहुत आसान, चीजें पाने के लिए आपको बहुत कुछ करना होगा।

उदाहरण के लिए, आप अपने स्वयं के चर पर ए, बी और सी प्रत्येक को कैसे प्राप्त करेंगे? यह निश्चित रूप से करने योग्य है, लेकिन यदि आप पाइप और गूंज (बहुत बुनियादी शैल सामान) नहीं समझते हैं, तो यह आपके लिए एक आसान काम नहीं होगा, इसलिए यदि संभव हो तो मैं एक बेहतर उपयुक्त भाषा का उपयोग करूंगा।

44

एक और अधिक प्रत्यक्ष तरीका होगा:

while read -a row 
do 
    echo "..${row[0]}..${row[1]}..${row[2]}.." 
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password) 

या में अलग-अलग चर:

myvar=$(mysql mydatabase -u $user -p$password -se "SELECT a, b, c FROM table_a") 
+5

मैं एस परम खोज रहा था, हालांकि आपको मुद्रित होने के लिए कॉलम नामों को दबाने के लिए इसे दो बार आपूर्ति करने की आवश्यकता है –

+0

यह चौंकाने वाला सबसे अच्छा जवाब है, यह कॉलम नाम वापस नहीं करता है! – user3479125

+1

मुझे लगता है कि '-p' और पासवर्ड के बीच सफेद स्थान हटा दिया जाना चाहिए। – frb

14

एक बैश सरणी आप यह कर सकते हैं में डेटा पंक्ति-दर-पंक्ति को पढ़ने के लिए

while read a b c 
do 
    echo "..${a}..${b}..${c}.." 
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password) 
+0

'अप्रत्याशित टोकन के पास वाक्यविन्यास त्रुटि' <' cut.sh: पंक्ति 26: 'किया <<' – thevoipman

+0

@thevoipman: संभवतः आपकी स्क्रिप्ट बैश का उपयोग नहीं कर रही है। आपका शेबांग क्या कहता है? साथ ही, चूंकि मैं आपकी स्क्रिप्ट नहीं देख पा रहा हूं, इसलिए मैं नहीं देख सकता कि त्रुटि कहां हो सकती है। –

+0

@thevoipman प्रक्रिया प्रतिस्थापन आपका मुद्दा प्रतीत होता है (हाँ, मुझे पता है, एक साल पहले, अगर कोई भी देख रहा है), लेकिन आप जिस भी खोल का उपयोग कर रहे हैं, उसके बजाय एक पाइपलाइन का उपयोग कर रिवर्स करना संभव हो सकता है, यानी 'गूंज ... | mysql ... | जबकि पढ़ा-पंक्ति; कर ...; done'। ध्यान रखें कि जबकि शरीर कमजोर है और इसके चारों ओर के खोल को प्रभावित नहीं करेगा। – falstro

3
myvariable=$(mysql database -u $user -p$password | SELECT A, B, C FROM table_a) 

के बाद रिक्त स्थान के बिना। यह मामूली है, लेकिन काम नहीं किए बिना।

0
myvariable=$(mysql -u user -p'password' -s -N <<QUERY_INPUT 
    use databaseName; 
    SELECT fieldName FROM tablename WHERE filedName='fieldValue'; 
QUERY_INPUT 
) 
echo "myvariable=$myvariable" 
+0

समस्या हल करने वाले कोड प्रदान करते समय, यह कम से कम एक संक्षिप्त स्पष्टीकरण देने के लिए सबसे अच्छा है कि यह कैसे काम करता है ताकि लोगों को पढ़ने के लिए अंतर को समझने के लिए मानसिक रूप से इसे लाइन के आधार पर पार्सल करना पड़े। – Fluffeh

5

आप बैश उपयोग में एक भी मान का उपयोग करना चाहते हैं:

companyid=$(mysql --user=$Username --password=$Password --database=$Database -s --execute="select CompanyID from mytable limit 1;"|cut -f1) 

    echo "$companyid" 
+0

यह वास्तव में चर में एक मान पढ़ता है – bebbo

0

एक अन्य उदाहरण है जब तालिका नाम या डेटाबेस इस तरह के एक अंतरिक्ष, या के रूप में असमर्थित वर्ण हैं '-'

db='data-base' 

db_d='' 
db_d+='`' 
db_d+=$db 
db_d+='`' 

myvariable=`mysql --user=$user --password=$password -e "SELECT A, B, C FROM $db_d.table_a;"` 
0

यदि आपके पास विशेष डेटाबेस नाम और एक होस्ट है जिस पर आप क्वेरी को निष्पादित करना चाहते हैं तो नीचे दिए गए प्रश्न का पालन करें:

outputofquery = $ (mysql -u "$ dbusername" -p "$ dbpassword" -h "$ dbhostname" "table_a से एक, बी, सी का चयन करें," -e $ dbname)

तो mysql प्रश्नों को चलाने के लिए आपको lins

संबंधित मुद्दे