Forループsqlは、シェルスクリプト内の変数出力の各行を照会します。

Forループsqlは、シェルスクリプト内の変数出力の各行を照会します。

$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...

おすすめ記事