我在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" (正确),但" *"缺少,并被工作目录中的任何垃圾所取代。
答案 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