2011-12-27 10 views
5

मैं एक शेल स्क्रिप्ट कैसे लिखूं जो SQLite परिणाम प्रदर्शित करता है? मैंने एक स्क्रिप्ट लिखी है जो SQLite डेटाबेस में एक प्रविष्टि जोड़ती है। अब मैं उस प्रविष्टि को जोड़ने के बाद परिणाम प्रदर्शित करना चाहता हूं।शेल स्क्रिप्टिंग SQLite

select sum(Average) from (select * from myTable where Category = 'category1'); 
select sum(Average) from (select * from myTable where Category = 'category2'); 

प्रारूप इस तरह होना चाहिए:

Category1 total = <output of first statement> 
Category2 total = <output of second statement> 

Thats यह मैं स्क्रिप्ट प्रतिध्वनित करने के लिए/बयानों के उत्पादन में थूक चाहते इसके बाद

echo 'insert into myTable (Date, Details, Category, Average) values (datetime('\''now'\'','\''localtime'\''), '\'''$1''\'', '\'''$2''\'', '$3');'|sqlite3 /Users/user/Documents/Test/dbName.db 

: यहाँ मेरी स्क्रिप्ट है । मैं एसक्यूएल के लिए काफी नया हूं और शेल स्क्रिप्टिंग के साथ इतना अच्छा नहीं हूं। मैं इस तरह की समस्याओं को समझाते हुए अच्छे ट्यूटोरियल की भी तलाश कर रहा हूं।

+1

चूंकि आप 'शेल स्क्रिप्टिंग के साथ उस महान नहीं हैं' तो शायद आपको इस समस्या को हल करने के लिए खोल स्क्रिप्ट का उपयोग नहीं करना चाहिए। जो भी कोडिंग सिस्टम (सी ++, टीसीएल, पायथन, ...) का उपयोग करें, आप सबसे अधिक विशेषज्ञ हैं। लगभग हर चीज जिसे आप उपयोग करना चाहते हैं, एसक्लाइट एपीआई में एक उपलब्ध इंटरफ़ेस है। – ravenspoint

+0

@ravenspoint: असल में, मैं SQL का उपयोग करके अपने वित्त का प्रबंधन कर रहा हूं, और शैल स्क्रिप्ट का उपयोग सामान को त्वरित रूप से जोड़ने और स्क्रिप्ट लॉन्चर (Quicksilver) से चलाकर रकम पढ़ने के लिए किया जाता है। – CodeBreaker

+0

चूंकि आप कहते हैं "मैं SQL के लिए काफी नया हूं" मैं आपके वित्त का प्रबंधन करने के लिए एसक्यूएल का उपयोग करने की सिफारिश करता हूं! – ravenspoint

उत्तर

9

एक आम इस समस्या को हल करने के लिए जिस तरह से एक खोल सुविधा यहां नामक दस्तावेज़ के उपयोग करने के लिए है, इस प्रयास करें:

sqlite3 /Users/user/Documents/Test/dbName.dba <<EOS 
    insert into myTable (Date, Details, Category, Average) 
       values(datetime('now','localtime'), '$1', '$2', '$3'); 

    select "Category1 total = " sum(Average) from (
      select * from myTable where Category = 'category1' 
    ); 

    select "Category2 total = " sum(Average) from (
     select * from myTable where Category = 'category2' 
    ); 

EOS 

नोट EOS किसी भी स्ट्रिंग आप की तरह (मैं EndOfScript के बारे में सोच) हो सकता है कि, लेकिन यह पाठ की आखिरी पंक्ति पर अकेले रहना चाहिए जिसमें कोई पीछे की जगह नहीं है।

जैसा कि मैं sqlite3 का उपयोग नहीं करता, आपको बैच को बंद करने के लिए कुछ स्टेटमेंट की आवश्यकता हो सकती है जिसे मैं नहीं जानता हूं। साथ ही, मुझे यकीन नहीं है कि '$ 1' सामान काम करेगा, अगर sqlite3 क्षमा कर रहा है, तो इसके बजाय "$ 1" आदि का प्रयास करें। इसके अलावा, आपको "CategoryN total = " स्ट्रिंग के बाद एक कॉमा की आवश्यकता हो सकती है।

ध्यान दें कि यह समाधान आपको अपने एसक्यूएल डीएमएल स्टेटमेंट्स को जितना चाहें उतना बड़ा/लंबा बनाने की अनुमति देता है। सामानों के लिए नियमित रूप से और बड़े टेबल से लेकर, यदि आपके सिस्टम पर अनुमतियां हैं, तो आप अपने डीएमएल को संग्रहीत प्रक्रिया में ले सकते हैं और उसे कॉल कर सकते हैं।

मुझे उम्मीद है कि इससे मदद मिलती है।

(यदि यह काम नहीं करता है, तो कृपया आप जिस खोल का उपयोग कर रहे हैं, ओएस/लिनक्स वेर और आपके द्वारा प्राप्त किए जा रहे त्रुटि संदेशों का एक न्यूनतम संस्करण इंगित करने के लिए अपनी पोस्ट संपादित करें)।

+0

धन्यवाद। तर्क सही है, लेकिन मैं तालिका में शामिल नहीं कर सकता (पहला एसक्यूएल कथन)। समस्या ब्रैकेट/उद्धरण के बारे में है। अन्य बयान ठीक से काम करते हैं। बीटीडब्ल्यू, रु .5 सामान मेरे प्रश्न में नहीं है। मेरे पास एक ब्राउज़र एक्सटेंशन है जो डॉलर को रुपए में परिवर्तित करता है, इसलिए रुपये 52 .. वास्तव में डॉलर के संकेत हैं, यानी तर्क: डॉलर 1, डॉलर 2, डॉलर 3। किसी भी तरह, यह मुझे डॉलर के संकेत दिखा रहा है और अन्य रु .52 – CodeBreaker

+0

आप पहले ईओएस को सिंगल-कोट कर सकते हैं, जैसे: 'sqlite3 dbName.dba << 'EOS' वह [शैल चर को विस्तारित होने से रोकता है] (http:/hemyoc के भीतर /mywiki.wooledge.org/HereDocument)। – Wildcard

3

यदि आपको एक स्क्वायर चरम पर एसक्लाइट चयन परिणाम असाइन करने की आवश्यकता है, तो आप यह कर सकते हैं।

r=$(sqlite3 your_db_path.db "select something from some_table where condition") 

$r आपका चर होगा।

एकल पंक्ति भी प्राप्त की जा सकती है। आप इसे एक सरणी में विभाजित करने के लिए कुछ काम कर सकते हैं, IFS

का उपयोग कर सकते हैं इसके अतिरिक्तसम्मेलन का उपयोग अपनी हर शेल स्क्रिप्ट के शीर्ष पर करने के लिए ध्यान में रखें। यह कई अवांछित मुद्दों को हल करेगा। कुछ बार पुराना #!/bin/sh सम्मेलन परेशानी देता है। :)।

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