2011-12-27 31 views
5

Làm cách nào để viết kịch bản lệnh shell hiển thị kết quả SQLite? Tôi đã viết một kịch bản cho biết thêm một mục nhập vào cơ sở dữ liệu SQLite. Bây giờ tôi muốn hiển thị kết quả sau khi thêm mục nhập đó. Dưới đây là kịch bản của tôi:Shell scripting SQLite

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

Sau này tôi muốn kịch bản để echo/nhổ đầu ra của báo cáo:

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

Định dạng nên như thế này:

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

Thats nó . Tôi khá mới với SQL và không phải là tuyệt vời với shell scripting. Tôi cũng đang tìm kiếm các hướng dẫn tốt giải thích các vấn đề như thế này.

+1

Vì bạn 'không tuyệt vời với kịch bản lệnh shell' nên có thể bạn không nên sử dụng các tập lệnh shell để giải quyết vấn đề này. Sử dụng bất kỳ hệ thống mã hóa nào (C++, TCL, python, ...) mà bạn là chuyên gia nhất. Hầu hết mọi thứ bạn có thể muốn sử dụng đều có giao diện có sẵn cho API sqlite. – ravenspoint

+0

@ravenspoint: Trên thực tế, tôi đang quản lý tài chính của mình bằng cách sử dụng SQL và các kịch bản lệnh shell được sử dụng để thêm nhanh công cụ và đọc tổng bằng cách chạy chúng từ trình khởi chạy tập lệnh (Quicksilver). – CodeBreaker

+0

Vì bạn nói "Tôi khá mới với SQL", tôi khuyên bạn nên sử dụng SQL để quản lý tài chính của bạn! – ravenspoint

Trả lời

9

Một cách phổ biến để giải quyết vấn đề này là sử dụng một tính năng vỏ gọi là đây tài liệu, hãy thử này:

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 

Lưu ý rằng EOS có thể là bất kỳ chuỗi bạn muốn (tôi nghĩ về EndOfScript), nhưng nó phải ở một mình trên dòng cuối cùng của văn bản không có khoảng trống ở cuối.

Vì tôi không sử dụng sqlite3, bạn có thể cần một số quy tắc để đóng hàng loạt mà tôi không biết. Ngoài ra, tôi không chắc chắn rằng các công cụ '$ 1' sẽ làm việc, nếu sqlite3 là tha thứ, hãy thử "$ 1", vv thay vào đó. Ngoài ra, bạn có thể cần dấu phẩy sau chuỗi "CategoryN total = ".

Lưu ý rằng giải pháp này cho phép bạn tạo các câu lệnh DML sql của bạn khá nhiều như lớn/dài như bạn muốn. Đối với các công cụ sẽ xảy ra thường xuyên và nó khác nhau, trên các bảng lớn, nếu bạn có quyền trên hệ thống của chúng tôi, bạn có thể muốn DML của bạn đến một thủ tục được lưu trữ và gọi đó.

Tôi hy vọng điều này sẽ hữu ích.

(Nếu cách này không hiệu quả, vui lòng chỉnh sửa bài đăng của bạn để biểu thị shell bạn đang sử dụng, OS/Linux Ver và phiên bản thông báo lỗi tối thiểu mà bạn đang nhận được).

+0

Cảm ơn. Logic là hoàn hảo, nhưng tôi không thể chèn vào bảng (câu lệnh SQL đầu tiên). Vấn đề là liên quan đến dấu ngoặc/dấu ngoặc kép. Các báo cáo khác hoạt động đúng. BTW, Rs.52 công cụ không phải là trong câu hỏi của tôi. Tôi có tiện ích mở rộng trình duyệt chuyển đổi đô la thành rupi, vì vậy Rs.52 .. thực ra là các ký hiệu đô la, tức là các đối số: đô la1, đô la2, đô la3. Bằng cách nào đó, nó cho tôi thấy những dấu hiệu đồng đô la và những người khác Rs.52 – CodeBreaker

+0

Bạn có thể trích dẫn đơn chiếc EOS đầu tiên, như sau: 'sqlite3 dbName.dba << 'EOS'' Điều đó [ngăn ngừa các biến hệ vỏ bị mở rộng] (http://mywiki.wooledge.org/HereDocument) trong heredoc. – Wildcard

3

Nếu bạn cần gán kết quả SELECT sqlite vào biến hệ vỏ, bạn có thể thực hiện việc này.

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

$r sẽ là biến của bạn.

Hàng đơn cũng có thể được tìm nạp. Bạn có thể thực hiện một số công việc để chia thành một mảng, có thể đang sử dụng IFS

Ngoài ra, hãy nhớ sử dụng quy ước #!/bin/bash trên đầu mỗi tập lệnh shell của bạn. Nó sẽ giải quyết nhiều vấn đề không mong muốn. Một số lần quy ước #!/bin/sh cũ gây ra rắc rối. :).

Các vấn đề liên quan