【发布时间】:2017-01-05 02:29:33
【问题描述】:
这里的新手,请原谅我使用的任何令人困惑的措辞。 我的一项常见任务是获取名称列表并执行 MySQL 查询以在表中查找名称,并查看它们是否在我们的站点上“活动”。
一次执行此操作,我的 SQL 查询运行良好。然后,我想使用列出多个名称的文件中的循环来进行查询。这也很好用。
我将此查询循环添加到我的 bash 配置文件中,以便我可以通过键入以下内容快速完成任务:
$ ValidOnSite fileName
这很好用,我什至为我的进程添加了一个用法语句来提醒自己注意语法。以下是我所拥有的一切正常:
validOnSite() {
if [[ "$1" == "" ]] || [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then
echo "Usage:"
echo " $ validOnSite [filename]"
echo " Where validOnSite uses specified file as variables in sql query:"
echo " SELECT name, active FROM dbDb WHERE name=lines in file"
else
cat $1 | while read line ; do hgsql -h genome-centdb hgcentral -Ne "select name, active from dbDb where name='$line'" ; done
fi
使用包含以下内容的文件“list.txt”:
nameA
nameB
然后我会输入:
validOnSite list.txt
list.txt 中的两个条目都符合我的查询条件并且在 sql 中找到。我的结果将是:
nameA 1
nameB 1
注意每个结果后面的“1”。我认为这是某种“是”状态。
现在,我在我的 list.txt 中添加了第三个名称,我知道这个名称在 sql 中不匹配。现在 list.txt 包含:
nameA
nameB
foo
当我再次为我的 3 行列表运行此命令时:
validOnSite list.txt
我的结果和我使用第一个版本的file.txt时一样,我看不到哪些行失败,我仍然只能看到哪些行是成功的:
nameA 1
nameB 1
我一直在尝试各种方法来添加一个嵌套的 if 语句,即“如果 $line 匹配,则回显“通过”,否则回显“失败”。
我不想在我的结果中看到“1”。使用具有 2 个匹配项和 1 个不匹配项的 file.txt,我希望我的结果是:
nameA pass
nameB pass
foo fail
或者更好的是,用绿色标记通过,用红色标记失败。
正如我所说,这里的新手... :)
任何指向正确方向的指针都会有所帮助。这是我最近一次悲伤的尝试,但我意识到我可能完全走错了方向:
validOnSite() {
if [[ "$1" == "" ]] || [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then
echo "Usage:"
echo " $ validOnSite [filename]"
echo " Where validOnSite uses specified file as variables in sql query:"
echo " SELECT name, active FROM dbDb WHERE name=lines in file"
else
cat $1 | while read line ; do hgsql -h genome-centdb hgcentral -Ne "select name, active from dbDb where name='$line'" > /dev/null ; done
if ( "status") then
echo $line "failed"
echo $line "failed" >> outfile
else
echo $line "ok"
echo $line "ok" >>outfile
clear
cat outfile
fi
fi
如果在我上一次尝试中有些东西看起来很疯狂,那是因为它是 - 我只是在谷歌上搜索并尝试尽可能多的东西,同时尝试学习。任何帮助表示赞赏,在长时间工作后我感到卡住了,但我很高兴能继续前进并找到解决方案!我认为我在理解标准输出方面缺少一些东西,并且对嵌套 if 也感到困惑。
注意:我不需要 outfile,但如果需要一个来完成目标也可以。单独的标准输出结果就足够了,并且是首选。
注意:hgssql 只是我们 MySQL 服务器的名称。 MySQL 部分工作正常,我正在寻找一种更好的方法来处理我的 bash 输出,我认为我缺少关于 stderr 的一些东西。由于我是新手,所以我正在寻找一个相当简单的答案!
【问题讨论】:
-
我不熟悉
hgsql,但我怀疑foo的错误被写入stderr而不是stdout(您仍然应该看到),但不会通过stdout的简单重定向重定向到一个文件。第二个想法是hgsql可能需要一个额外的选项(例如猜测--verbose或类似的东西)来报告失败查询的结果。在hgsql文档中搜索一下,看看您是否发现这些方面有帮助。 -
感谢您的评论。实际上,hgsql 只是我们 MySQL 服务器的名称。
-
为什么不调用
mysql -Bse "query..."使用-B(batch) 模式会返回每个查询的结果。 -
@DavidC.Rankin 谢谢,我不知道 -Bse。我只是尝试使用它,但没有得到不匹配查询的结果。
标签: mysql bash if-statement stdout tty