$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