从shell脚本处理mysql查询中的star *条目

时间:2014-09-03 09:46:38

标签: mysql shell

我在shell脚本中使用以下构造(使用破折号,但我认为在这种情况下bash没有区别):

for FIELD in `echo "select column_with_varchar_type from table" | mysql MYDATABASE`
do
    echo "FIELD: $FIELD"
done

这适用于普通字符串,但是对于star(" *")在column_with_varchar_type中的条目失败,然后破折号扩展它以使用当前工作目录中的所有文件,当然完全错了。

有没有办法阻止shell扩展或用mysql查询中的其他东西替换星号?

澄清:我不想选择所有列"选择*",但我想选择一列的所有条目,其中一个条目是一个星形的字符串。查询的输入不包含任何星标,并且没问题,问题在于查询的输出。

例如,如果表格包含字符串" aaa"," bbb"和" *",典型的输出可能是:

FIELD: aaa
FIELD: bbb
FIELD: Makefile
FIELD: src
FIELD: some_other_file_that_happens_to_be_in_the_working_directory.txt

所以我得到了字符串" aaa"和" bbb" (正确),但" *"缺少,并被工作目录中的任何垃圾所取代。

3 个答案:

答案 0 :(得分:1)

更新

正如评论中所讨论的,这可能是一种方法:

while read -r field
do
    echo "FIELD: $field"
done < <(echo "select column_with_varchar_type from table" | mysql MYDATABASE)

因为问题在于来自查询的数据,而不是来自查询本身。因此,有必要处理来自此类查询的*字符串,并while -r解决它。


问题是当*在双引号内时,它会被shell扩展。

您可以改为使用单引号:

for FIELD in $(echo 'select * from table' | mysql MYDATABASE)
do
    do_something
done

注意您也可以使用-e选项:

mysql MYDATABASE -e 'select * from table'

答案 1 :(得分:0)

试试这个:

for FIELD in `echo 'select \* from table' | mysql MYDATABASE`
do
    do_something
done

答案 2 :(得分:0)

解决方案是在MySQL查询中添加引号:

for FIELD in `mysql MYDATABASE -e 'select concat(concat("\"", column_with_varchar_type), "\"") from table'`
do
    echo "FIELD: $FIELD"
done