Bash: не удалось устранить непредвиденную синтаксическую ошибку токена

Цель: я пытаюсь настроить VVV, где я намерен не запускать резервные копии БД по умолчанию для определенных баз данных.

Где я застрял: я продолжаю получать syntax error near unexpected token `done' даже когда я использую разрывы строк в скрипте bash.

Предпринятые шаги: я также удостоверился, что в обоих сценариях 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

2 ответа

Решение

Я понял следующий ответ после многочисленных проб и ошибок.

Файл: 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

После пропущенной точки с запятой 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

Кстати, обратные слеши после | не нужны, так как команда не может заканчиваться одинокой трубкой.

Другие вопросы по тегам