【发布时间】:2015-10-19 03:51:21
【问题描述】:
我有一个 bash 脚本,用于循环和处理类似 SQL 查询的结果。
while read field1 field2 field3 field4
do
{...something here...}
done < <(mysql -h $HOST -u $USER -p"$PASS" $DB << EOF
{...multi-line select query here...}
EOF)
我不知道如何解决的问题是如何重构它,以便在查询数据库出现问题时获取返回码、错误并跳过循环?
编辑:
我已尝试使用具有以下内容的命名管道。
mkfifo /tmp/mypipe
mysql -h $HOST -u $USER -p"$PASS" $DB << EOF >> /tmp/mypipe
{...multi-line select query here...}
EOF
echo $?
{...loop here...}
这似乎不起作用,因为 mysql 命令会等待管道被读取,然后再继续。所以除非我有东西读取管道mysql不会退出有返回码。
我已尝试先将查询结果存储到一个变量中,如下所示。
DATADUMP=$(mysql -h $HOST -u $USER -p"$PASS" $DB -e \
'select stuff from place \
join table 1 on record ..... \
')
我遇到的问题是读取循环只会从 DATADUMP 变量中读取前四个“单词”,而忽略其余的。
在这一点上,除非有人回来有一个好主意,否则我将 mktemp 一个临时文件来保存查询结果。我希望避免不断地读写磁盘,但我的最后期限很快就要到了。
【问题讨论】:
-
当
mysql失败时,你会得到循环看到的任何输出吗?那就是您只对循环从不运行的情况感兴趣吗?或者您可以获得部分数据但仍然需要捕获命令失败?如果是后者(或者您特别想要返回代码而不仅仅是“失败”),那么您可能需要使用 fifo,以便您可以单独运行 mysql 并写入它,然后稍后再读取它(或类似的东西)。 -
我会说,仅仅“跳过”可能还不够。只要一致性很重要并且与 DDL 无关,就可以进行事务。此外,bash 可能不是最好的选择。比如:将查询合并到文件中(如果可能的话,使用事务处理)然后执行。
-
当mysql失败时,无论它的输出是什么,都会被循环处理。
标签: mysql bash io-redirection return-code