这是从 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\n
Windows 上常见的回车符-换行符组合 ( )。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
来修复换行符。