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데이터베이스 및/또는 테이블을 나열하는 데 사용하고 while read IFS=jw013에서 제안하는 것처럼 사용하는 것이 좋습니다(아마도 옵션 없이 -r).

답변4

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

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

관련 정보