Bash:从某些文件读取时,连接字符串失败

时间:2012-05-07 12:23:23

标签: 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}

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

在这些情况下工作:

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

确实在这些情况下工作:

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

我发现这很奇怪。是否有人认识到这一点?

/路德维希

2 个答案:

答案 0 :(得分: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

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

从这句话:

  

在某些情况下,它可以很好地工作,但在其他情况下,一个字符串中的字符会替换另一个字符,而不是之后放置。

我无法理解究竟发生了什么(我不是英语母语人士,所以这可能是我的错。)

干杯, 贾科莫

答案 1 :(得分:1)

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

您也可以在要检索的字符串上动态执行此操作。

以下是两种方法:

使用sed代替grep

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

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

OR

现在执行grep并进行第二次参数展开以去除回车。

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

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