我有一个 bash 脚本:
#!/bin/bash
set -x
PATH=/bin:/sbin:/usr/bin:/usr/sbin
server="$1"
curdate=$(date +'%Y%m%d')
sshoptions="-i /root/.ssh/backup -q -t"
mysqluser="root"
mysqlpassword=$(ssh $sshoptions root@$server "cat /root/.my.passwd")
mysqlaccess="-u$mysqluser -p$mysqlpassword"
mysqldatabases=$(ssh $sshoptions root@$server "mysql $mysqlaccess -B -N -e \"SHOW DATABASES;\" | grep -E -v 'information_schema|mysql'")
mysqldump="mysqldump $mysqlaccess --opt --skip-comments -B -R"
for db in $mysqldatabases; do
echo "$(date +"%Y/%m/%d %H:%M:%S") mysqldump: dump $db"
ssh $sshoptions root@$server "$mysqldump $db" | gzip -9 > $db_$curdate.sql.gz
done
如您所见,它用于 MySQL 数据库的备份(我打算将其与 rsnapshot 一起使用)。
运行此脚本时出现问题:
# bash /etc/rsnapshot.scripts/mysql.sh sugar.dev.host.com
+ PATH=/bin:/sbin:/usr/bin:/usr/sbin
+ server=sugar.dev.host.com
++ date +%Y%m%d
+ curdate=20130321
+ sshoptions='-i /root/.ssh/backup -q -t'
+ mysqluser=root
++ ssh -i /root/.ssh/backup -q -t [email protected] 'cat /root/.my.passwd'
+ mysqlpassword=XXXXXX
+ mysqlaccess='-uroot -pXXXXXX'
++ ssh -i /root/.ssh/backup -q -t [email protected] 'mysql -uroot -pXXXXXX -B -N -e "SHOW DATABASES;" | grep -E -v '\''information_schema|mysql'\'''
+ mysqldatabases=$'sugarcrm\r'
+ mysqldump='mysqldump -uroot -pXXXXXX --opt --skip-comments -B -R'
+ for db in '$mysqldatabases'
++ date '+%Y/%m/%d %H:%M:%S'
' echo '2013/03/21 17:41:04 mysqldump: dump sugarcrm
2013/03/21 17:41:04 mysqldump: dump sugarcrm
+ gzip -9
' ssh -i /root/.ssh/backup -q -t [email protected] 'mysqldump -uroot -pXXXXXX --opt --skip-comments -B -R sugarcrm
所以,我有从解析的 SQL 查询中得到的 '\r' 符号。我在转储中看到这个错误:
mysqldump:出现错误:1102:选择数据库时数据库名称“sugarcrm^M”不正确
我怎样才能正确修剪它?对于“正确”,我的意思是我们不能马上这样做,因为“mysqldatabases”变量有一个值。因为这里是一个 DB,但如果它是两个或更多,stdout 将是错误的。所以我的意见是我们必须在“for”循环中修剪符号。
请建议一个正确的方法。谢谢你。
我会先尝试对 mysql 使用原始参数 --raw 或 -r。
如果这不起作用,我会用 tr eg 删除它们
另一种方式:
sed
bash 本机
(
\r
又名^M
,如您所知)是一个回车符(ASCII 控制字符 CR)。一些操作系统使用它作为行尾的一部分,例如 Windows 以\r\n
(CR,NL,ASCII 预期的方式)结束行,Mac 这样做\n\r
,并且 Unix 创造者以他们无限的智慧通过结束行保存了一个字节\n
。所以你在 Unix/Linux 上处理 Windows/DOS 约定中的文本。有一个名为dos2unix
修复行尾的工具(在 Fedora 中这个包叫做dos2unix
)。小心,只是剥离\r
可能会损坏(二进制)文件。