bash - 从某些文件读取时连接字符串失败

标签 bash

我有一个部署到服务器的 Web 应用程序。我正在尝试创建一个脚本,该脚本除了其他内容外,还可以从与应用程序一起部署的属性文件中读取 Web 应用程序的当前版本。

文件看起来像这样:

//other content
version=[version number]
build=[buildnumber]
//other content

我想创建一个如下所示的变量:version-buildnumber

这是我的脚本:

VERSION_FILE=myfile

VERSION_LINE="$(grep "version=" $VERSION_FILE)"
VERSION=${VERSION_LINE#$"version="}
BUILDNUMBER_LINE=$(grep "build=" $VERSION_FILE)
BUILDNUMBER=${BUILDNUMBER_LINE#$"build="}
THEVERSION=${VERSION}-${BUILDNUMBER}

奇怪的是,这在某些情况下有效,但在其他情况下却无效。 我遇到的问题是当我试图连接字符串时(即上面的最后一行)。在某些情况下,它工作得很好,但在其他情况下,一个字符串中的字符会替换另一个字符串中的字符,而不是放在后面。

它在这些情况下起作用:

  • 当我从部署的文件中读取时
  • 如果我将部署的文件复制到另一个位置并从那里读取

在这些情况下它确实有效:

  • 如果我从头开始编写文件并从中读取。
  • 如果我创建自己的文件,然后将部署文件中的内容复制到我创建的文件中。

我觉得这很奇怪。那里有人认识到这一点吗?

最佳答案

您的文件中很可能包含回车符。您可以通过在文件上运行 dos2unix 来解决这个问题。

您也可以在正在检索的字符串上即时执行此操作。

有以下几种方式:

sed代替grep:

VERSION_LINE="$(sed -n "/version=/{s///;s/\r//g;p}" $VERSION_FILE)"

而且您不需要 Bash 参数扩展来去除“version=”。

像现在一样执行 grep 并执行第二个参数扩展以去除回车符。

VERSION=${VERSION_LINE#$"version="}
VERSION=${VERSION//$'\r'}

顺便说一下,我建议习惯性地使用小写或大小写混合的变量名,以减少名称冲突的机会。

关于bash - 从某些文件读取时连接字符串失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10482023/

相关文章:

linux - 我如何使用管道或重定向在 Linux 中按照我想要的顺序将文件附加到另一个文件?

bash - gnu 并行缺少 bash 的参数?

xml - 使用 grep/sed 从 XML 文件中查找单词

linux - 有人可以告诉我错误在哪里吗

linux - 是否可以使 wget 的进度条适应多个文件?

git - "bash: __gitdir: command not found"终端错误

linux - 移动除某些文件外的所有文件

bash - wc为什么加一

bash - 无法跳出最里面的 while 循环——Bash - Ubuntu

linux - 遍历文件,搜索 nan 的