我编写了一个脚本,向 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>
解决此问题的一种常见方法是使用称为此处文档的 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 嵌套的级别。正确引用嵌入代码可能是一个相当大的工程)-;
如果您需要将 sqlite SELECT 结果分配给 shell 变量,您可以这样做。
r=$(sqlite3 your_db_path.db "select something from some_table where condition")
$r
将是你的变量。
也可以获取单行。您可以做一些工作将其拆分为数组,可能使用IFS
另外请记住在每个 shell 脚本之上使用
#!/bin/bash
约定。它将解决许多不需要的问题。有时,旧的#!/bin/sh
惯例会带来麻烦。 :).
#!/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'..."