【问题标题】:Syntax error: "(" unexpected on shell script语法错误:“(”在 shell 脚本中出现意外
【发布时间】:2013-11-06 03:02:52
【问题描述】:

我在 Ubuntu 上运行以下代码时收到 7: Syntax error: "(" unexpected 错误。但它在 centos 上运行没有任何问题。

#!/bin/sh
#
TODATE=`date '+%Y-%b-%d'`
#
# Backup Creation for Databases
#
databases=(`echo 'show databases;' | mysql -u root -ppaSSword | grep -v ^Database$`)
for DB in "${databases[@]}"; do
mysqldump --force --opt --user=root --password=paSSword $DB | gzip > /mnt/Backup/DB/${DB}_${TODATE}.sql.gz
done
#

请帮我解决这个问题。

我无法找出问题所在。但是,

我正在使用以下代码进行备份。它在 Ubuntu 上运行良好

#!/bin/bash
#
TODATE=`date '+%Y-%b-%d'`
databases="$(mysql -u root -ppaSSword -Bse 'show databases')"
for DB in $databases
do
mysqldump -u root -psqlMYadmin $DB | gzip > /mnt/Backup/DB/${DB}_${TODATE}.sql.gz
done

【问题讨论】:

    标签: shell centos ubuntu-12.04


    【解决方案1】:

    您可以将“显示数据库”的输出重定向到 dump.txt 文件,如果完成则尝试。

     #!/bin/bash
     da=$(date +"%d-%m-%y")
     for db in `cat dump.txt` ; do mysqldump --force --opt --user=root --password=paSSword $db | gzip /path/to/backup/$db_"$da".sql.gz ; done
    

    【讨论】:

      【解决方案2】:

      您需要转义databases= ...中的最后一个'$'。

      【讨论】:

        【解决方案3】:

        脚本中只有一个(,而你有shebang 行#!/bin/sh。我的最佳猜测是程序 /bin/sh 无法识别数组赋值,而 /bin/bash 会。

        将您的 shebang 更改为 #!/bin/bash

        您最好使用$(...) 代替反引号。)另外,正如Sami Laine 在他的answer 中指出的那样,最好将正则表达式引用到grep命令(虽然这不是你的问题的原因):

        databases=( $(echo 'show databases;' | mysql -u root -ppaSSword | grep -v '^Database$') )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多