AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 490049
Accepted
Evgenii Iablokov
Evgenii Iablokov
Asked: 2013-03-22 05:55:48 +0800 CST2013-03-22 05:55:48 +0800 CST 2013-03-22 05:55:48 +0800 CST

如何在 bash 脚本执行期间正确删除 '\r' 符号

  • 772

我有一个 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
  • 3 3 个回答
  • 2232 Views

3 个回答

  • Voted
  1. wuzuu
    2013-03-22T06:05:39+08:002013-03-22T06:05:39+08:00

    我会先尝试对 mysql 使用原始参数 --raw 或 -r。

    --原始,-r
    
               对于表格输出,列周围的“装箱”启用一列
               区别于其他价值。对于非表格输出(例如
               以批处理模式或 --batch 或 --silent 选项时生成
               给出),特殊字符在输出中被转义,因此它们可以
               容易被识别。换行符、制表符、NUL 和反斜杠被写入
               作为 \n、\t、\0 和 \\。--raw 选项禁用此字符
               逃跑。
    
               以下示例演示了表格输出与非表格输出
               并使用原始模式禁用转义:
    
                   % mysql
                   mysql> 选择字符 (92);
                   +----------+
                   | 字符 (92) |
                   +----------+
                   | \ |
                   +----------+
                   % mysql -s
                   mysql> 选择字符 (92);
                   字符(92)
                   \\
                   % mysql -s -r
                   mysql> 选择字符 (92);
                   字符(92)
                   \
    

    如果这不起作用,我会用 tr eg 删除它们

    tr -d '\r'
    • 2
  2. Best Answer
    Andrey Domas
    2013-03-22T06:12:27+08:002013-03-22T06:12:27+08:00

    另一种方式:

    sed

    for db in '$mysqldatabases'; do
        db=$(echo $db|sed 's/\r$//')
    

    bash 本机

    for db in '$mysqldatabases'; do
        db=${db//\r/}
    
    • 1
  3. vonbrand
    2013-03-22T12:36:00+08:002013-03-22T12:36:00+08:00

    (\r又名^M,如您所知)是一个回车符(ASCII 控制字符 CR)。一些操作系统使用它作为行尾的一部分,例如 Windows 以\r\n(CR,NL,ASCII 预期的方式)结束行,Mac 这样做\n\r,并且 Unix 创造者以他们无限的智慧通过结束行保存了一个字节\n。所以你在 Unix/Linux 上处理 Windows/DOS 约定中的文本。有一个名为dos2unix修复行尾的工具(在 Fedora 中这个包叫做dos2unix)。小心,只是剥离\r可能会损坏(二进制)文件。

    • 0

相关问题

  • 开源与专有关系 db mgt 系统的优缺点是什么?

  • 在 solaris 10 上为 mysql 设置 max_allowed_pa​​cket

  • 如何移动 MySQL 的数据目录?

  • 通过 VPN 连接什么是远程服务器 IP?

  • mysql崩溃

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve