从 bash 脚本中删除“\r”

从 bash 脚本中删除“\r”

这是从 PHP 发送变量的 Bash 脚本:

STRING1="/opt/lampp/htdocs/dev/img/$VAR1"
mv $STRING1 "/opt/lampp/htdocs/dev/newlocation/"

由于某种原因,它位于\r的末尾$STRING1,并且找不到该文件,因为它将是 形式的东西my_picture.jpg\r

任何帮助都将不胜感激!

答案1

Bash 认为脚本中的行尾始终且仅是一个换行符 ( \n),Unix 风格,而不是\r\nWindows 上常见的回车符-换行符组合 ( )。Bash 认为该\r字符只是字符串末尾的普通字符。(双引号字符串后面的字符只是连接到末尾。)

正如 Ignacio 所建议的,解决方案是修复脚本以消除\r字符。dos2unix这是一种方法。另一种方法是用作tr -d '\r' < infile > outfile过滤器。

答案2

这显然是为了像我这样的其他谷歌员工,而不是原帖者的目的,因为已经过去 5 年多了。但这个解决方案当时也存在。

您可以尝试使用 bash 替换从字符串末尾删除最大的模式,类似于 ${varname%%pattern},更多信息请参见:

http://tldp.org/LDP/abs/html/string-manipulation.html

这应该比产生另一个进程(如 tr)来处理它更快。

VARNAME=$'a_bad_filename\r'
VARNAME="${VARNAME%%[[:cntrl:]]}"

以下是严重限制 bash 模式匹配(它实际上不是正则表达式,更像是“like”或“glob”表达式)。至于为什么回车符属于控制类而不是空格类,我不确定。它在其他语言中被视为空格。如果不通过“shopt -s extglob”启用扩展模式匹配,则无法在 bash 中指定像“此字符重复 0 次或更多次”这样的简单构造。我还发现

printf "%q" "${VARNAME}"

..除了set -vx显示/测试回车符。

当我使用 cygwin bash 来处理标准(非 cygwin)版本的 python 的输出时遇到了这个问题;我很困惑为什么我没有看到更多有关如何解决这个问题的信息。

答案3

传递脚本dos2unix来修复换行符。

相关内容