如何在Bash中为<<EOF执行的SQLite3查询结果分配变量名
如何将SQLite查询结果格式化为指定键值对形式?
你可以通过捕获SQLite查询的输出结果,将其赋值给变量后再格式化输出,这里有两种简单可靠的方法:
方法一:一次性捕获所有结果并分配变量
修改你的脚本,用命令替换捕获sqlite3的输出,再通过read命令将两个结果分别存入变量,最后输出指定格式:
#!/usr/bin/env bash cd /Users/amar/Documents/ThesisCode/CEP_codes/mqtt-receiver # 捕获两个查询的结果并分配给变量 read latency throughput <<< $(sqlite3 database <<EOF SELECT sum(detection_time - generation_time)/count(*) from mobile_cep_data; SELECT ((max(detection_time)- min(detection_time))*1000)/count(*) from mobile_cep_data; EOF ) # 按照需求格式化输出 echo "latency = $latency、throughput = $throughput"
这个方法的前提是sqlite3的两个查询结果会以空格(或换行)分隔输出,read命令会自动将连续的空白字符(包括换行)作为分隔符,把值分配给对应的变量。
方法二:分开执行查询并单独捕获结果
如果担心输出格式变化(比如某个查询返回空行或多输出),可以将两个查询分开执行,分别捕获结果,这样更稳妥:
#!/usr/bin/env bash cd /Users/amar/Documents/ThesisCode/CEP_codes/mqtt-receiver # 分别执行两个查询,捕获各自结果 latency=$(sqlite3 database "SELECT sum(detection_time - generation_time)/count(*) from mobile_cep_data;") throughput=$(sqlite3 database "SELECT ((max(detection_time)- min(detection_time))*1000)/count(*) from mobile_cep_data;") # 格式化输出 echo "latency = $latency、throughput = $throughput"
这种方式避免了多个查询输出合并可能带来的问题,每个变量对应明确的查询结果,可读性和稳定性都更好。
小提示
如果你的sqlite3输出存在多余的空行,可以在捕获结果时用sed '/^$/d'过滤掉,比如:
latency=$(sqlite3 database "SELECT ..." | sed '/^$/d')
内容的提问来源于stack exchange,提问作者Amarjit Dhillon
相关产品推荐
相关产品推荐

