$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
と末尾に次の単語を挿入して一連のステートメントを生成し、;
それをデータベースクライアントに提供できます。
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"
テーブルごとに1つのステートメントの代わりに、カンマで区切られたテーブルのリストを使用することもできます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