Bash에서 출력 라인을 배열로 사용

Bash에서 출력 라인을 배열로 사용

공유 웹 호스트에 mysql 데이터베이스가 있습니다. 크기가 너무 커지면 압축이 포함된 단일 덤프 프로세스가 종료됩니다. 각 테이블을 개별적으로 덤프하고 압축하고 싶습니다. 이 명령을 사용하세요

mysqldump -uuser -ppass database < show_tables.sql

다음과 같이 모든 테이블의 이름을 반환하도록 할 수 있습니다.

table1
table2
etc
...

각 줄이 이 구문을 사용하여 명령에 입력되도록 이를 bash 스크립트에 어떻게 입력합니까?

mysqldump -uuser -ppass database table_name_goes_here > and_here.sql

?

편집하다죄송합니다. 원본 형식에 실수를 했습니다. 쿼리의 출력은 show tables공백으로 구분된 테이블 이름이 포함된 한 줄이 아닙니다. 실제로는 현재 형식과 마찬가지로 한 줄에 하나의 테이블 이름입니다. 혼란을 드려 죄송합니다.

답변1

mysqldump -uuser -ppass database < show_tables.sql |
xargs -I TableName sh -c 'mysqldump -uuser -ppass database TableName > TableName.sql'

답변2

테이블 이름에 개행 문자가 포함될 수 없다고 가정하면,

mysqldump -uuser -ppass database < show_tables.sql | 
while IFS= read -r table; do
        mysqldump -uuser -ppass database "$table" > and_here.sql
done

답변3

이것수동설명하다

   Arrays are assigned to using compound assignments of the form name=(value1 ... valuen),

따라서 명령의 출력을 원하는 위치에 배치할 수 있는 방법이 필요합니다 value1 ... valuen.

당신은 이것을 할 수 있습니다

databases=( $(mysqldump -uuser -ppass database < show_tables.sql) )

그런 다음 이렇게 반복하십시오.

for database in ${databases[*]}; do
    ...
done

그러나 테이블 이름이 정말 이상하고 줄 바꿈이 포함되어 있는 경우를 대비하여 이를 사용하여 mysql -Bse데이터베이스 및/또는 테이블을 나열하고 jw013이 제안한 대로 사용하는 것이 좋습니다(아마 해당 옵션 while read IFS=없이 ).-r

답변4

mysql database -e 'show tables' | while read table
do mysqldump -uuser -ppass database "$table" -r "$table.sql"
done

테이블의 공백에서도 작동합니다.

관련 정보