如何避免作为 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”值,它是字符串。 '<p1>box crashed with exit status 0</p1>'
存储在不同的索引中,根据空间进行拆分。
$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 脚本中数组中的不同字段的主要内容,如果未能解决你的问题,请参考以下文章