【问题标题】:Script throwing unexpected operator when using mysqldump使用 mysqldump 时脚本抛出意外的运算符
【发布时间】:2011-03-20 11:59:56
【问题描述】:

我用来备份 MySQL 数据库的部分脚本在将 Debian 机器升级到 6.0 Squeeze 后停止正常工作。我已经通过 CLI 测试了备份代码,它工作正常。我相信这是在备份发生之前选择数据库,可能与 $skipdb 变量有关。如果有更好的方法来执行该功能,那么我将尝试一些新的东西。任何见解将不胜感激。

$ sudo ./script.sh
[: 138: information_schema: unexpected operator
[: 138: -1: unexpected operator
[: 138: mysql: unexpected operator
[: 138: -1: unexpected operator

使用 bash -x script 是其中一种迭代:

+ for db in '$DBS'
+ skipdb=-1
+ '[' test '!=' '' ']'
+ for i in '$IGGY'
+ '[' mysql == test ']'
+ :
+ '[' -1 == -1 ']'
++ /bin/date +%F
+ FILE=/backups/hostname.2011-03-20.mysql.mysql.tar.gz
+ '[' no = yes ']'
+ /usr/bin/mysqldump --single-transaction -u root -h localhost '-ppassword' mysql
+ /bin/tar -czvf /backups/hostname.2011-03-20.mysql.mysql.tar.gz mysql.sql
mysql.sql
+ rm -f mysql.sql

这里是代码。

if [ $MYSQL_UP = "yes" ]; then
echo "MySQL DUMP" >> /tmp/update.log
echo "--------------------------------" >> /tmp/update.log
DBS="$($MYSQL -u $MyUSER -h $MyHOST -p"$MyPASS" -Bse 'show databases')"
for db in $DBS
do
    skipdb=-1
    if [ "$IGGY" != "" ] ;
    then
        for i in $IGGY
        do
            [ "$db" == "$i" ] && skipdb=1 || :
        done
    fi
    if [ "$skipdb" == "-1" ] ;
    then
        FILE="$DEST$HOST.`$DATE +"%F"`.$db.mysql.tar.gz"
        if [ $ENCRYPT = "yes" ]; then
            $MYSQLDUMP -u $MyUSER -h $MyHOST -p"$MyPASS" $db > $db.sql && $TAR -czvf - $db.sql | $OPENSSL enc -aes-256-cbc -salt -out $FILE.enc -k $ENC_PASS && rm -f $db.sql
        else
            $MYSQLDUMP --single-transaction -u $MyUSER -h $MyHOST -p"$MyPASS" $db > $db.sql && $TAR -czvf $FILE $db.sql && rm -f $db.sql
        fi
    fi
done

fi

【问题讨论】:

  • 你最喜欢的iffi在哪里?
  • 您应该将-x 选项添加到您的shebang 以准确查看您的shell 正在尝试运行什么。
  • 编辑了问题,添加了我在原始帖子中忘记的 fi 以及调试输出。

标签: mysql shell scripting openssl mysqldump


【解决方案1】:

我最好的猜测是您没有 shebang 行或默认 shell 已更改。您的问题出在这一行:

[ "$db" == "$i" ] && skipdb=1 || :

和/或这个:

if [ "$skipdb" == "-1" ]

Bash 对在单个方括号内的 == 非常满意,但例如 Dash 就不是。将这些行更改为使用单个等号:

[ "$db" = "$i" ] && skipdb=1 || :

和:

if [ "$skipdb" = "-1" ]

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

【讨论】:

    【解决方案2】:

    我的猜测是,您的 $MYSQL 没有返回您期望的值,而是打印了一些您使用 for db in $DBS ; do ... done 迭代的错误消息。

    尝试手动运行$MYSQL -u $MyUSER -h $MyHOST -p"$MyPASS" -Bse 'show databases' 命令。

    bash -x script 也是你的朋友。

    【讨论】:

    • 我手动运行了该命令,它返回了正确的数据库名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    相关资源
    最近更新 更多