如何避免作为 sql 查询输出的一部分返回的字符串值被拆分为 bash/shell 脚本中数组中的不同字段

Posted

技术标签:

【中文标题】如何避免作为 sql 查询输出的一部分返回的字符串值被拆分为 bash/shell 脚本中数组中的不同字段【英文标题】:How to avoid string value returned as part of sql query output being split into different fields in array in bash/shell script 【发布时间】:2021-11-30 14:24:39 【问题描述】:

我的 sql 查询的输出有多个列,并且包含包含空格的字符串值。我需要编写 bash 脚本,其中我必须将值读入变量,然后在脚本中进一步使用它,并将它们插入另一个数据库。

当我将输出存储到数组中时,字符串值会根据空间进行拆分并存储到数组中的不同索引中。我如何在 bash 脚本中处理这种情况。

CMD="SELECT * FROM upload where upload_time>='2020-11-18 00:19:48' LIMIT 1;"
output=($(mysql $DBCONNECT --database=uploads -N --execute="$CMD"))
echo $output[9]

Output:
version test_id upload_time parser_result 25 567 2020-11-18 00:19:48 <p1>box crashed with exit status 0</p1>

上传时间“2020-11-18 00:19:48”存储在两个索引中。 更成问题的是“parser_result”值,它是字符串。 '&lt;p1&gt;box crashed with exit status 0&lt;/p1&gt;' 存储在不同的索引中,根据空间进行拆分。

$output[8] contains '<p1>box'
$output[9] contains 'crashed'

数据库非常庞大,我需要解析其中的每一行。 由于字符串值可以是任何我无法想出通用代码的东西。处理这种情况的最佳方法是什么。我是第一次使用 bash 脚本!!我必须使用 bash 脚本,因为该脚本将作为 docker 容器内的 cron 作业运行。

【问题讨论】:

【参考方案1】:

字段由 TAB 分隔。将其用作您的 $IFS 来解析结果。

IFS=$'\t' output=($(mysql $DBCONNECT --database=uploads -N --execute="$CMD"))
echo "$output[9]"

如果$DBCONNECT 包含用空格分隔的选项,您需要分两步执行此操作,因为它也使用$IFS 进行拆分。

result=$(mysql $DBCONNECT --database=uploads -N --execute="$CMD")
IFS=$'\t' output=($result)
echo "$ouptut[9]"

【讨论】:

谢谢。但是您建议的更改低于错误。 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2) 请参阅***.com/questions/13365553/…,了解将多个命令参数放入像$DBCONNECT 这样的变量中的正确方法,而不是用空格分隔它们。 非常感谢它确实解决了我的问题。谢谢!!!!!!

以上是关于如何避免作为 sql 查询输出的一部分返回的字符串值被拆分为 bash/shell 脚本中数组中的不同字段的主要内容,如果未能解决你的问题,请参考以下文章

如何避免两次编写 SQL Server 查询以避免重复?

SQL:如何从 sql 中的函数输出中获取子字符串?

输出到 XML 的 SQL 查询

当查询作为 Java 中方法的参数出现时,如何避免 SQL 注入?

如何避免多个子查询作为表达式(SQL优化)

SELECT 查询从每个组中返回 1 行