【问题标题】:Bash: Couldn't resolve the unexpected token syntax errorBash:无法解决意外的令牌语法错误
【发布时间】:2017-11-28 08:14:02
【问题描述】:

目标:我正在尝试设置VVV,我不打算在特定数据库上默认不运行数据库备份。

我遇到的困难:即使我在 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

【问题讨论】:

    标签: bash vagrant-provision vvv-wordpress


    【解决方案1】:

    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
    

    顺便说一句,| 之后的反斜杠不需要,因为命令不能以单独的管道结束。

    【讨论】:

    • 我尝试了对您的答案稍作修改的版本,它有所帮助。我无法将其发布在 cmets 中,因此作为单独的答案发布。但是非常感谢你,你拯救了我的一天!
    • "您有什么理由不将代码格式化为更多行吗?" - 代码属于 VVV repo,它是这样格式化的。所以我试着坚持他们的标准。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2016-10-31
      • 1970-01-01
      • 2019-10-28
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多