如何编写显示 SQLite 结果的 shell 脚本?

问题描述 投票:0回答:3

我编写了一个脚本,向 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>
sqlite shell
3个回答
15
投票

解决此问题的一种常见方法是使用称为此处文档的 shell 功能,请尝试以下操作:

 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 = "
字符串后面加一个逗号。

请注意,此解决方案允许您根据需要创建任意大小/长度的 sql DML 语句。对于定期发生并且涉及大型表的事情,如果您拥有我们系统的权限,您可能希望将 DML 存储到存储过程并调用它。

我希望这有帮助。

(如果这不起作用,请编辑您的帖子以表明您正在使用的 shell、操作系统/Linux 版本以及您收到的错误消息的最小版本)。

编辑:请注意,如果您在开发测试中使用下面评论中提到的

'EOS'
引用,则 O.P. 的引用 (
'\'''$1''\''
) 可能仍然合适,具体取决于 shell 嵌套的级别。正确引用嵌入代码可能是一个相当大的工程)-;


8
投票

如果您需要将 sqlite SELECT 结果分配给 shell 变量,您可以这样做。

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

$r
将是你的变量。

也可以获取单行。您可以做一些工作将其拆分为数组,可能使用IFS

另外请记住在每个 shell 脚本之上使用

#!/bin/bash
约定。它将解决许多不需要的问题。有时,旧的
#!/bin/sh
惯例会带来麻烦。 :).


0
投票
#!/bin/bash

# Prompt user for server name
read -p "Enter the server name: " servername

# SQLite database file
DB_FILE="servers.db"

# Query to retrieve server details based on servername
query_result=$(sqlite3 $DB_FILE "SELECT App, FID, Server_Name, Data_Center, Product, Status FROM servers WHERE Server_Name='$servername';")

# Check if query_result is empty (server not found)
if [[ -z "$query_result" ]]; then
    echo "Server '$servername' is not in our inventory."
    exit 0
fi

# Extract values from query_result
IFS='|' read -r App FID Server_Name Data_Center Product Status <<< "$query_result"

if [[ "$Status" == "No" ]]; then
    echo "No SSH Key exchange available for server '$servername'."
    echo "Please login manually and execute the below command:"
    echo "curl -k https://example.com/ssh-setup-script.sh | bash"
    exit 0
fi

# If status is 'Yes', continue with SSH login (replace with your actual SSH script)
echo "Proceeding with SSH login to server '$servername'..."
© www.soinside.com 2019 - 2024. All rights reserved.