如何在bash脚本执行过程中正确删除'\ r'符号

我有一个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可以破坏(二进制)文件。