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

答え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

関連情報