2017-11-28 10 views
0

목표 :VVV 특정 데이터베이스에서 DB 백업을 기본적으로 실행하지 않으려 고합니다.Bash : 예기치 않은 토큰 구문 오류를 해결할 수 없습니다.

내가 붙어있는 곳 : bash 스크립트에서 줄 바꿈을 사용할 때도 계속 syntax error near unexpected token `done'이 계속 나타납니다.

걸리는 단계 : 나는 또한 두 bash 스크립트에서 LF 라인 결말을 확인했지만 동일한 오류가 발생합니다.

파일 : vagrant_halt_custom

#!/bin/bash 
# 
# This script is run whenever `vagrant halt` is used to power off 
# the virtual machine. To customize this behavior, include a file 
# in your local VVV/config/homebin directory: vagrant_halt_custom 
# 
# Look for a custom trigger file. If this exists, we'll assume that 
# all trigger actions should be handled by this custom script. If 
# it does not exist, then we'll handle some basic tasks. 
db_backup_custom 

파일 : db_backup_custom

#!/bin/bash 
# 
# Create individual SQL files for each database. These files 
# are imported automatically during an initial provision if 
# the databases exist per the import-sql.sh process. 
mysql -e 'show databases' | \ 
grep -v -F "information_schema" | \ 
grep -v -F "performance_schema" | \ 
grep -v -F "mysql" | \ 
grep -v -F "test" | \ 
grep -v -F "Database" | \ 
while read dbname; do if [ "$dbname" == "mydb" ]; then echo "Database $dbname skipped." && continue fi; mysqldump -uroot "$dbname" > /srv/database/backups/"$dbnme".sql && echo "Database $dbname backed up..."; done 

오류

==> default: Running triggers before halt... 
/home/vagrant/bin/db_backup_custom: line 12: syntax error near unexpected token `done' 
/home/vagrant/bin/db_backup_custom: line 12: `while read dbname; do if [ "$dbname" == "mydb" ]; then echo "Database $dbname skipped." && continue fi; mysqldump -uroot "$dbname" > /srv/database/backups/"$dbnme".sql && echo "Database $dbname backed up..."; done' 
Connection to 127.0.0.1 closed. 
==> default: Attempting graceful shutdown of VM... 
==> default: [vagrant-hostsupdater] Removing hosts 

답변

0

많은 시행 착오 끝에 다음과 같은 대답을 찾았습니다.

파일 : db_backup_custom

#!/bin/bash 
# 
# Create individual SQL files for each database. These files 
# are imported automatically during an initial provision if 
# the databases exist per the import-sql.sh process. 
mysql -e 'show databases' | \ 
grep -v -F "information_schema" | \ 
grep -v -F "performance_schema" | \ 
grep -v -F "mysql" | \ 
grep -v -F "test" | \ 
grep -v -F "Database" | \ 
while read dbname; do 
    if [ "$dbname" == "mydb" ] ; then 
     echo "Database $dbname skipped." \ 
      && continue; 
    fi 
    mysqldump -uroot "$dbname" > /srv/database/backups/"$dbnme".sql && 
     echo "Database $dbname backed up..."; done; 

팁 : bash는 스크립트 구문 오류가있는 경우 다음 명령을 사용하여이 확인합니다.

bash -n bin/db_backup_custom 
3

continue 뒤에 세미콜론이 없습니다.

코드를 더 많은 줄로 지정하지 않은 이유는 무엇입니까? 명령이 파이프 펜텐 끝나야 할 수 없기

while read dbname; do 
    if [ "$dbname" == "mydb" ] ; then 
     echo "Database $dbname skipped." 
      && continue 
    fi 
    mysqldump -uroot "$dbname" > /srv/database/backups/"$dbnme".sql && 
     echo "Database $dbname backed up..." 
done 

BTW, | 후 슬래시 필요하지 않다.

+0

약간 수정 된 버전의 답을 시도했지만 도움이되었습니다. 내가 코멘트에 게시 할 수 없으므로 별도의 답변으로 게시하십시오. 그러나 대단히 감사합니다, 당신은 저의 하루를 구했습니다! –

+0

"코드를 더 많은 줄로 포맷하지 않은 이유는 무엇입니까?" - 코드가 VVV repo에 속하며 그 방식으로 형식이 지정되었습니다. 그래서 나는 그들의 기준을 고수하려고 노력했다. –