2011-12-27 15 views
5

SQLite結果を表示するシェルスクリプトを作成するにはどうすればよいですか? SQLiteデータベースにエントリを追加するスクリプトを作成しました。今、私はそのエントリを追加した後に結果を表示したい。ここ は私のスクリプトです。この後シェルスクリプトSQLite

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

私はスクリプトが文の出力を吐く/エコーしたい:

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> 

。私はSQLにはかなり新しく、シェルスクリプトではそれほど素晴らしいものではありません。私はまた、このような問題を説明する良いチュートリアルを探しています。

+1

あなたは「シェルスクリプトではそれほどではありません」ので、この問題を解決するためにシェルスクリプトを使用しないでください。どのようなコーディングシステム(C++、TCL、Python、...など)を使用しても構いません。ほとんどの場合、使用する可能性のあるものはすべて、sqlite APIへの利用可能なインターフェイスを備えています。 – ravenspoint

+0

@ravenspoint:実際には、SQLを使用して財務を管理しています。シェルスクリプトは、スクリプトランチャー(Quicksilver)からそれらを実行することによって、素早く追加して合計を読み込むために使用されます。 – CodeBreaker

+0

あなたは「私はSQLにはまったく新しい」と言っているので、SQLを使って財務を管理することをお勧めします! – ravenspoint

答えて

9

この問題を解決するための一般的な方法の1つは、シェルの機能を使用することですが、ここでは文書と呼ばれる、これを試してください:EOSは、お好きな文字列にすることができていること

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 

注(私はEndOfScriptと思う)、それ末尾の空白のないテキストの最後の行に単独でなければなりません。

私はsqlite3を使用しないので、私が気付いていないバッチを閉じるためにいくつかの文章が必要な場合があります。また、sqlite3が寛容で、 "$ 1"などを試していると、 '$ 1'のものがうまくいくかどうかはわかりません。また、"CategoryN total = "文字列の後にカンマを付ける必要があります。

このソリューションを使用すると、必要に応じてbig/longとしてSQL DML文を作成できます。定期的に実行されるものや大きなテーブルにまたがるものについては、システムへのアクセス権がある場合は、DMLをストアドプロシージャに置き換えて呼び出すことができます。

こちらがお役に立てば幸いです。

(これでうまくいかない場合は、使用しているシェル、OS/Linux Verおよび取得しているエラーメッセージの最小バージョンを示すために投稿を編集してください)。

+0

ありがとう。ロジックは完璧ですが、テーブルに挿入することはできません(最初のSQLステートメント)。問題は大括弧/引用符に関連しています。他のステートメントは正しく機能します。 BTW、Rs.52のものは私の質問にはありません。私はドルをルピーに変換するブラウザエクステンションを持っているので、Rs.52 ..は実際にドル記号、すなわち引数:ドル1、ドル2、ドル3です。どういうわけか、それは私にドル記号などを表示していますRs.52 – CodeBreaker

+0

'sqlite3 dbName.dba << 'EOS''これは[シェル変数が展開されないようにする] /mywiki.wooledge.org/HereDocument)を参照してください。 – Wildcard

3

sqliteのSELECT結果をシェル変数に割り当てる必要がある場合は、これを行うことができます。

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

$rが変数になります。

単列も取り出すことができます。 IFS

さらに、すべてのシェルスクリプトの上に#!/bin/bashの規則を使用することに注意してください。それは多くの望ましくない問題を解決します。時々古い#!/bin/sh大会は問題を引き起こします。 :)。