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"

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

관련 정보