我将用于备份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脚本是其中一个迭代:
+ 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
网络连接
答案 0 :(得分:2)
我最好的猜测是你没有shebang线或者默认的shell已经改变了。你的问题就在这一行:
[ "$db" == "$i" ] && skipdb=1 || :
和/或这一个:
if [ "$skipdb" == "-1" ]
Bash对单个方括号内的==
非常满意,但Dash例如并非如此。将这些行更改为使用单个等号:
[ "$db" = "$i" ] && skipdb=1 || :
和
if [ "$skipdb" = "-1" ]
或将您的shebang更改为#!/bin/bash
。
答案 1 :(得分:1)
我的猜测是你的$MYSQL
没有返回你期望的值,而是打印一些错误信息,你用for db in $DBS ; do ... done
进行迭代。
尝试手动运行$MYSQL -u $MyUSER -h $MyHOST -p"$MyPASS" -Bse 'show databases'
命令。
bash -x script
也是你的朋友。