$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"
테이블당 하나의 명령문 대신 쉼표로 구분된 테이블 목록을 사용할 수도 있습니다 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