【问题标题】:Bash string concatenation producing weird results [duplicate]Bash字符串连接产生奇怪的结果[重复]
【发布时间】:2018-03-08 23:38:08
【问题描述】:

我的 bash 代码 file.sh :

username=$1
pkgpath="/home/${username}_tmp.txt"
echo $username
echo $pkgpath

现在使用命令bash file.sh abc 运行脚本应该会产生结果:

abc
/home/abc_tmp.txt

但我得到的输出是:

abc
_tmp.txtc

有人可以解释为什么会发生这种行为以及如何获得所需的结果吗?

编辑
我想提一下,使用pkgpath="/home/${username}" 给我/home/abc(需要)但运行pkgpath="${username}_tmp.txt"给我_tmp.txt(奇怪)。

【问题讨论】:

  • 你是说你在末尾附加了一个额外的字符c,而它不太可能有? (除了未扩展的变量值)。您是否在命令行上运行此脚本?您是否偶然在 Windows 编辑器 (Notepad++) 中编辑了脚本?
  • 我刚刚将它复制/粘贴到我的机器上,效果很好
  • 实际上我是通过远程登录到我的 RHEL5 桌面运行的,但没关系,因为我尝试直接在桌面上运行并且结果相同
  • 如果文件来自 Windows,那么以 \r 结尾的行可能会导致此类问题,尤其是当您在不同平台上进行编辑时。
  • 请阅读stackoverflow.com/tags/bash/info。它要求您在发布前检查的第一件事是您的脚本是否使用 DOS 行尾。

标签: bash shell scripting string-concatenation


【解决方案1】:

当您运行命令bash file abc 时,您似乎以某种方式在abc 之后插入了一个回车符。罪魁祸首可能是您的终端,或者您正在复制粘贴命令并且在没有意识到的情况下包含^M

所以 bash 在第二行输出的是真正的/home/abc^M_tmp.txt,它被渲染为_tmp.txtc。您可以通过将命令的输出传送到less -R 来轻松验证这一点。

【讨论】:

  • 是的,确实有一个^M。请问,我该如何解决这个问题
  • 参考此答案后:unix.stackexchange.com/questions/56024/… 我刚刚实现了从 Windows 行以崇高文本结尾的 Unix 行,问题已解决!
猜你喜欢
  • 2011-10-15
  • 1970-01-01
  • 2017-02-18
  • 2023-03-08
  • 2014-07-05
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多