3

我有一个部署到服务器的 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}

奇怪的是,这在某些情况下有效,但在其他情况下无效。我遇到的问题是当我尝试连接字符串时(即上面的最后一行)。在某些情况下,它可以完美运行,但在其他情况下,一个字符串中的字符会替换另一个字符串中的字符,而不是在之后放置。

在这些情况下它不起作用

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

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

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

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

4

2 回答 2

1

鉴于此foo.txt

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

您可以使用以下方法更轻松地提取版本构建字符串awk

awk -F'=' '$1 == "version" { version = $2}; $1 == "build" { build = $2}; END { print version"-"build}' foo.txt

我不知道为什么你的脚本不起作用。你能提供一个错误输出的例子吗?

从这句话:

在某些情况下,它可以完美运行,但在其他情况下,一个字符串中的字符会替换另一个字符串中的字符,而不是在之后放置。

我不明白到底发生了什么(我不是以英语为母语的人,所以这可能是我的错)。

干杯,贾科莫

于 2012-05-07T12:34:22.697 回答
1

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

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

这里有几种方法:

sed代替grep

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

并且您不需要 Bash 参数扩展来去除“版本 =”。

或者

grep你现在做的,做第二个参数扩展来去掉回车。

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

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

于 2012-05-07T13:57:55.027 回答