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

从shell脚本处理mysql查询中的star*项,mysql,shell,Mysql,Shell,我在shell脚本中使用以下构造(使用破折号,但我认为在这种情况下与bash没有区别): 这对于普通字符串很好,但是对于星(“*”)位于列\u中且类型为\u varchar\u的条目,它失败了,然后dash将其展开以使用当前工作目录中的所有文件,这当然是完全错误的 在mysql查询中,有没有办法防止shell扩展或用其他东西替换星形 澄清:我不想选择所有列“select*”,但我想选择一列的所有条目,其中一个条目是一个星形字符串。查询的输入不包含任何星号,并且没有问题,问题在于查询的输出 例如,

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

这对于普通字符串很好,但是对于星(“*”)位于列\u中且类型为\u varchar\u的条目,它失败了,然后dash将其展开以使用当前工作目录中的所有文件,这当然是完全错误的

在mysql查询中,有没有办法防止shell扩展或用其他东西替换星形

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

例如,如果表格包含字符串“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”(正确),但“*”丢失,并被工作目录中的任何垃圾所取代。

尝试以下方法:

for FIELD in `echo 'select \* from table' | mysql MYDATABASE`
do
    do_something
done
更新 如评论中所述,这可以是一种方法:

while read -r field
do
    echo "FIELD: $field"
done < <(echo "select column_with_varchar_type from table" | mysql MYDATABASE)
注意:您也可以使用
-e
选项:

mysql MYDATABASE -e 'select * from table'

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

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

我不想选择所有列,但该列中只有一列和一个条目是星型的。好的,我的解释也适用于此:只需将所有查询写在单引号内。如果您提供您正在使用的查询,我也将更新我的答案。注意当你做某事时,你也需要在你做的事情上使用单引号。当然它不适用,因为echo命令正在处理查询的输入,但问题在于查询的输出。(是的,我确实检查了它,以防$()语法起作用,但这也没有帮助)尝试使用另一种可能的语法:
while read-r字段;做回显“字段:$FIELD”;做得好如果你用管子的话,子外壳是打开的。典型的情况是在读取时执行
cat文件…
,是的,在这种情况下,您失去了从原始shell更改值的能力。但是有了这个
while
我建议这不会发生,因为没有这样的管道打开子shell。无论如何,很好,您通过以另一种方式提供输出找到了解决方案。请参阅说明:输入很好,输入不包含任何星号,问题在于输出中包含的条目是带有单个星号的字符串。
mysql MYDATABASE -e 'select * from table'
for FIELD in `mysql MYDATABASE -e 'select concat(concat("\"", column_with_varchar_type), "\"") from table'`
do
    echo "FIELD: $FIELD"
done