在while循环中运行mysql命令

时间:2016-07-01 06:13:58

标签: mysql shell

我有一个mysql数据库列表,我希望从名称以" _abc"使用linux脚本。但是,我一直收到错误"意外的文件结束"。

这是我的脚本,其中DB_FILE是一个文本文件,其中包含以" _abc"结尾的数据库名称。

while read db_name;
do
    OUT_FILENAME="${db_name}_table.csv"
    mysql -u$MYSQLUSER -p$MYSQLPASS -h $MYSQLHOST $db_name << EOFMYSQL
    SELECT * FROM table_abc INTO OUTFILE '$OUT_FILENAME' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
    EOFMYSQL
done < $DB_FILE

rm -f $DB_FILE

如果删除3条MYSQL行,则脚本运行时没有错误。

另一个问题,如果我有2个SELECT个查询,我是否必须单独运行每个查询,即每个查询都包含在EOFMYSQL语句中,或者我可以在一个EOFMYSQL内查询这两个查询阻止?

2 个答案:

答案 0 :(得分:2)

$OUT_FILENAME不会在单引号内展开。

我猜您可以将查询放在如下所示的数组中:

MYQUERY=( SELECT \* FROM table_abc INTO OUTFILE "$OUT_FILENAME" FIELDS TERMINATED BY \",\" LINES TERMINATED BY \"\\n\"\; )

然后将mysql命令更改为:

mysql -u"$MYSQLUSER" -p"$MYSQLPASS" -h "$MYSQLHOST" -e "${MYQUERY[@]}" "$db_name"

<强>图片的标题说明

  1. 我引用了所有变量以避免单词分裂。
  2. 请注意,我们希望在此处重新创建实际查询。所以你需要逃避那些具有特殊含义的字符,如\*\"等。

答案 1 :(得分:2)

我认为你必须在EOFMYSQL之前没有空格:不要只缩进那个。

while read db_name;
do
    OUT_FILENAME="${db_name}_table.csv"
    mysql -u$MYSQLUSER -p$MYSQLPASS -h $MYSQLHOST $db_name << EOFMYSQL
    SELECT * FROM table_abc INTO OUTFILE '$OUT_FILENAME' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
EOFMYSQL
done < $DB_FILE

rm -f $DB_FILE

在一些合适的文本编辑器中,它会很容易显示,这里是notepad ++:

右缩进:

notepad++ right indent

错误的缩进:

notepad++ wrong indent