我有一个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:select数据库时数据库名称不正确“sugarcrm ^ M”
我怎样才能正确地修剪它? 用'正确'我的意思是我们不能马上做'mysqldatabases'variables有一个值。 因为这里有一个DB,但是如果是两个或多个,stdout将会是错误的。 所以我的意见是,我们必须在'for'周期修剪符号。
请build议一个正确的方法。 谢谢。
另一种方法:
SED
for db in '$mysqldatabases'; do db=$(echo $db|sed 's/\r$//')
bash原生
for db in '$mysqldatabases'; do db=${db//\r/}
我会尝试使用原始参数到MySQL首先–raw或-r。
--raw,-r
对于表格输出,围绕列的“装箱”启用一列
价值被区分。 对于非expression式输出(例如
如在批处理模式下或者在--batch或--silent选项中生成的那样
被给出),特殊字符在输出中被转义,所以他们可以
被轻易识别。 换行符,制表符,NUL和反斜杠都是写的
如\ n,\ t,\ 0和\\。 --raw选项禁用这个字符
逃跑。
以下示例演示了表格与非表格输出
并使用原始模式禁用转义:
%mysql
mysql> SELECT CHAR(92);
+ ---------- +
| CHAR(92)|
+ ---------- +
| \ |
+ ---------- +
%mysql -s
mysql> SELECT CHAR(92);
CHAR(92)
\\
%mysql -s -r
mysql> SELECT CHAR(92);
CHAR(92)
\
如果这不起作用,我会删除他们与tr例如
tr -d'\ r'
\r (又名^M ,如你所知)是一个回车(ASCII控制字符CR)。 一些操作系统使用它作为行结束的一部分,例如Windows以\r\n (CR,NL,如ASCII所示)结束行,Mac是\n\r ,并以他们无穷的智慧Unix创build者(h)一个字节结束行\n 。 所以你在Unix / Linux上处理Windows / DOS约定的文本。 有一个名为dos2unix的工具可以修复行(在Fedora中这个包叫做dos2unix )。 小心,只是剥离\r可以破坏(二进制)文件。