MySQL

2011-05-07 4 views
12

के माध्यम से बैश स्क्रिप्ट लूप मुझे एक बैश स्क्रिप्ट चाहिए जो दूरस्थ डेटा बेस से MySQL डेटा पुनर्प्राप्त कर सकता है। दरअसल मैंने ऐसा किया है, लेकिन अब मुझे यह करने की ज़रूरत है कि किसी भी तरह के रिकॉर्ड के माध्यम से लूप है और एक वैरिएबल को दूसरी बैश फ़ाइल में पास करें।MySQL

mysql -X -u $MyUSER -p$MyPASS -h$MyHOST -D$MyDB -e'SELECT `theme_name`, `guid` FROM `themes` WHERE `theme_purchased`="1" AND `theme_compiled`='0';' > themes.xml 
download_themes.sh 

यह एक xml theme.xml कहा जाता है अभी, मैं सिर्फ डेटा लूप करने के लिए किसी तरह यह पता लगाने की कोशिश कर रहा था फ़ाइल में डेटा निर्यात करता है: यहाँ मेरी MySQL कॉल है। मैं PHP और perl से बचने की कोशिश कर रहा हूं और बस बैश का उपयोग करने की कोशिश कर रहा हूं। अग्रिम में धन्यवाद।

+4

क्या कोई विशिष्ट कारण है कि आप स्क्रिप्टिंग भाषाओं से बचना चाहते हैं? आप बैश में एक्सएमएल को सही तरीके से पार्स करने में सक्षम नहीं होंगे। आपको आउटपुट से बचने में भी समस्या हो सकती है। आसान तरीका क्यों न जाएं और php/perl/python/lua/java/tcl/जावास्क्रिप्ट/... या बाश के अलावा गंभीरता से कुछ भी क्यों न करें जो कई आउटपुट के लिए इसे ठीक से करने में सक्षम नहीं होगा? – viraptor

+0

आप नहीं जानते कि इसके माध्यम से सरणी और लूप के रूप में आउटपुट करने का कोई तरीका है या नहीं? मैंने यह गुगल किया है कि मैं कुछ भी नहीं ढूंढ सका। –

उत्तर

33

कुछ की तरह:

mysql -e "SELECT `theme_name`, `guid` FROM `themes` WHERE `theme_purchased`='1' AND `theme_compiled`='0'" | while read theme_name guid; do 
    # use $theme_name and $guid variables 
    echo "theme: $theme_name, guid: $guid" 
done 
संक्षेप में

: mysql आदेश आउटपुट रिकॉर्ड से '\ n' और '\ t' जब उत्पादन एक पाइप है के द्वारा अलग क्षेत्रों अलग कर दिया। read कमांड एक पंक्ति पढ़ता है, फ़ील्ड में विभाजित होता है, और प्रत्येक को एक चर पर रखता है।

यदि आपके डेटा में फ़ील्ड में रिक्त स्थान हैं, तो आपको डिफ़ॉल्ट read विभाजन के साथ कुछ समस्याएं मिलती हैं। इसके चारों ओर कुछ तरीके हैं; लेकिन यदि आप केवल दो फ़ील्ड पढ़ रहे हैं और उनमें से एक में कोई रिक्त स्थान नहीं होना चाहिए (जैसे guid), तो आप अंत में 'खतरनाक' फ़ील्ड डाल सकते हैं, और read अंतिम चर में सबकुछ 'अतिरिक्त' रखेगा ।

इस तरह:

mysql -e "SELECT `guid` `theme_name`, FROM `themes` WHERE `theme_purchased`='1' AND `theme_compiled`='0'" | while read guid theme_name; do 
    # use $theme_name and $guid variables 
    echo "theme: $theme_name, guid: $guid" 
done 
+0

ऐसा पहली बार काम करता था, लेकिन अब यह मुझे यह देता है: /winterboard_theme_builder/get_themes.sh: लाइन 9: अप्रत्याशित टोकन 'किया गया' /winterboard_theme_builder/get_themes के पास वाक्यविन्यास त्रुटि।sh: line 9: 'done ' –

+0

असल में गलत लाइन पर था, लेकिन फिर मुझे एक अलग त्रुटि मिलती है। यह /winterboard_theme_builder/get_themes.sh: पंक्ति 7: पढ़ें: 'theme_name, ': मान्य पहचानकर्ता –

+0

ओह, ठीक नहीं है। 'read' तर्कों के बीच कोई कॉमा नहीं, और 'do' से पहले अर्धविराम। निश्चित – Javier

2

बजाय outputting एक्सएमएल, हो सकता है मेरा सुझाव है तो आप बस उत्पादन टैब से अलग मूल्यों के SELECT INTO OUTFILE वाक्य रचना या mysql --batch --raw का उपयोग करें। आपके पास आवश्यक फ़ील्ड पुनर्प्राप्त करने और उन्हें बैश के साथ पुन: उपयोग करने के लिए cut और awk जैसे यूनिक्स टूलचेन के बाकी हिस्सों में बैश के माध्यम से आपके पास बहुत आसान पहुंच है। कोई अन्य स्क्रिप्टिंग भाषा जरूरी नहीं है और आपको एक्सएमएल के साथ गड़बड़ की जरूरत नहीं है।

mysql --batch --raw -u $MyUSER -p$MyPASS -h$MyHOST -D$MyDB -e'SELECT `theme_name`, `guid` FROM `themes` WHERE `theme_purchased`="1" AND `theme_compiled`='0';' \ 
| awk '{print "theme: " $1 " guid: " $2}' 
3

स्वीकार्य उत्तर आउटपुट में होने पर स्वीकार्य उत्तर काम नहीं करता है।


>mysql ... -BNr -e "SELECT 'funny man', 'wonderful' UNION SELECT 'no_space', 'I love spaces';" | while IFS=$'\t' read theme_name guid; do echo "theme: $theme_name guid: $guid"; done 
theme: funny man guid: wonderful 
theme: no_space guid: I love spaces 

आप होगा, ज़ाहिर है, अपनी खुद की क्वेरी स्थानापन्न करना चाहते हैं: यह एक आसान ठीक (- - ध्यान दें $ यह अजीब है आईएफएस = $ '\ t') है।

1

पाइप '|' जबकि खतरनाक है, क्योंकि लूप के अंदर के बदलाव किसी अन्य उपप्रजाति में होते हैं और वर्तमान स्क्रिप्ट में प्रभावी नहीं होंगे।

वैसे, मुझे बाहरी फ़ाइल समाधान पर जाने से नफरत है।

मैं "Process Substitute" का उपयोग करने का सुझाव देता हूं।

while read field1 field2 field3 
do 
done < <(mysql -NB -e "$sql") 
# ^
# space needed 
+0

के अंदर वैश्विक चर सेट करने में सक्षम नहीं होंगे, इस मामले में mysql क्वेरी/कनेक्शन विफल होने पर यह पता लगाने के लिए कैसे? – Siva