2011-12-27 47 views
5

¿Cómo escribo un script de shell que muestra los resultados de SQLite? He escrito una secuencia de comandos que agrega una entrada a la base de datos SQLite. Ahora quiero mostrar los resultados después de agregar esa entrada. Aquí está mi script:Creación de secuencias de comandos del shell SQLite

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

Después de esto, quiero que el script eco/escupir la salida de los estados:

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

El formato debe ser así:

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

Eso es todo . Soy bastante nuevo en SQL y no tan bueno con scripts de shell. También estoy buscando buenos tutoriales que expliquen problemas como este.

+1

Dado que 'no eres tan bueno con scripts de shell', entonces probablemente no deberías estar usando scripts de shell para resolver este problema. Utilice el sistema de codificación (C++, TCL, python, ...) en el que sea más experto. Casi todo lo que desee utilizar tiene una interfaz disponible para la API sqlite. – ravenspoint

+0

@ravenspoint: en realidad, estoy administrando mis finanzas usando SQL, y los scripts de shell se usan para agregar cosas rápidamente y leer sumas ejecutándolas desde un iniciador de scripts (Quicksilver). – CodeBreaker

+0

Como dices "soy bastante nuevo en SQL", recomendaría no usar SQL para administrar tus finanzas. – ravenspoint

Respuesta

9

Una forma común de resolver este problema es utilizar una función de cáscara denomina aquí documento, intente esto:

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 

Tenga en cuenta que EOS puede ser cualquier cadena te gusta (pienso en EndOfScript), pero debe estar solo en la última línea de texto sin espacios en blanco al final.

Como no uso sqlite3, es posible que necesite alguna declaración para cerrar el lote que no conozco. Además, no estoy seguro de que el material '$ 1' funcione, si sqlite3 es indulgente, pruebe con "$ 1", etc. en su lugar. Además, puede necesitar una coma después de la cadena "CategoryN total = ".

Tenga en cuenta que esta solución le permite crear sus sentencias DML sql casi tan grandes como desee. Para cosas que ocurrirán regularmente y que abarcan mesas grandes, si tiene permisos en nuestro sistema, puede querer que su LMD sea un procedimiento almacenado y llamarlo.

Espero que esto ayude.

(Si esto no funciona, edite su publicación para indicar el shell que está utilizando, OS/Linux Ver y una versión mínima de los mensajes de error que está recibiendo).

+0

Gracias. La lógica es perfecta, pero no puedo insertarla en la tabla (primera declaración de SQL). El problema es con respecto a los corchetes/citas. Las otras declaraciones funcionan correctamente. Por cierto, Rs.52 cosas no está en mi pregunta. Tengo una extensión de navegador que convierte dólares a rupias, por lo que los Rs.52 son en realidad signos de dólar, es decir, los argumentos: dólar1, dólar2, dólar3. De alguna manera, me está mostrando signos de dólar y otros Rs.52 – CodeBreaker

+0

Puede citar de forma simple el primer EOS, así: 'sqlite3 dbName.dba << 'EOS'' Eso [evita que las variables del shell se expandan] (http://mywiki.wooledge.org/HereDocument) dentro del heredoc. – Wildcard

3

Si necesita asignar el resultado de sqlite SELECT a una variable de shell, puede hacerlo.

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

$r será su variable.

También se puede buscar una fila. Puede hacer un poco de trabajo para dividirlo en una matriz, puede estar usando IFS

Además, tenga en cuenta el uso de la convención #!/bin/bash en la parte superior de cada script de shell. Solucionará muchos problemas no deseados. Algunas veces la vieja convención #!/bin/sh da problemas. :).

Cuestiones relacionadas