For循环sql查询shell脚本中变量输出的每一行

For循环sql查询shell脚本中变量输出的每一行

$columns_output 内部值如下所示:

dbname1.tablename
dbname2.tablename
dbname3.tablename
dbname4.tablename

部分脚本部分

$columns_output=""

for value in "$columns_output"; do

    sql_query2="ANALYZE table '$columns_output';"

    query_result2=$(mysql -h "$db_host" -P "$db_port" -u "$db_user" -p"$db_password" -e "$sql_query2")

    echo -e "Query Analyze Results:\n$query_result2"
done

如何实现像下面这样的结果需要对每一行执行查询?需要一些逻辑和纠正方面的帮助。

ANALYZE table dbname1.tablename;
ANALYZE table dbname2.tablename;
ANALYZE table dbname3.tablename;
ANALYZE table dbname4.tablename;

答案1

假设这columns_output是一个包含换行符分隔的表名称的单个字符串。然后,我们可以ANALYZE TABLE通过在 中 每行的开头插入这些单词$columns_output,并在末尾插入 a 来创建一组语句;,然后将它们提供给数据库客户端:

printf '%s\n' "$columns_output" | sed '/.*/ANALYZE TABLE &;/' |
mysql -h "$db_host" -P "$db_port" -u "$db_user" -p"$db_password"

使用一系列表:

tables=(
    dbname1.tablename
    dbname2.tablename
    dbname3.tablename
    dbname4.tablename
)

printf 'ANALYZE TABLE %s;\n' "${tables[@]}" |
mysql -h "$db_host" -P "$db_port" -u "$db_user" -p"$db_password"

您还可以使用ANALYZE TABLES(注意S)与逗号分隔的表列表,而不是每个表使用一个语句。假设我们使用上面的表名数组:

(IFS=, ; printf 'ANALYZE TABLES %s\n' "${tables[*]}") |
mysql ...as before...

答案2

假设你的$column_output变量是这样的:

$ printf -v columns_output 'dbname1.tablename\ndbname2.tablename\ndbname3.tablename\ndbname4.tablename' 
$ echo "$columns_output" 
dbname1.tablename
dbname2.tablename
dbname3.tablename
dbname4.tablename

你可以这样做:

printf '%s\n' "$columns_output" | while read table; do
  sql_query2="ANALYZE table '$columns_output';"
  query_result2=$(mysql -h "$db_host" -P "$db_port" -u "$db_user" -p"$db_password" -e "$sql_query2")
  printf 'Query Analysis Results:\n%s\n' "$query_result2"
done

如果您可以完全控制输入,那么使用columns_output数组而不是字符串可能更有意义。如果您有一个生成表列表的命令,您可以像这样创建数组:

table_array=( $(command_that_lists_tables) )

或者,如果您手动写出它们,如下所示:

table_array=("dbname1.tablename" "dbname2.tablename" 
             "dbname3.tablename" "dbname4.tablename")

接下来,想必您想知道什么来自哪个表,因此不用提供信息量不大的“查询分析结果”,只需打印出表的名称,然后打印结果即可。像这样:

for table in "${table_array[@]}"; do 
   printf '---- Analyzing table "%s" ----\n' "$table"
   mysql -h "$db_host" -P "$db_port" -u "$db_user" -p"$db_password" \
      -e "ANALYZE table '$table';"
done

相关内容