2012-05-07 74 views
3

我有一个部署到服务器的Web应用程序。我正在尝试创建一个脚本,用于从与应用程序一起部署的属性文件中读取当前版本的Web应用程序。Bash:从某些文件读取时连接字符串失败

文件看起来是这样的:

//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} 

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

它在这些情况下工作:

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

阅读确实在这些情况下工作:

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

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

/路德维希

+0

你可以重现吗?,你尝试用'set -x'调试吗? – KurzedMetal

+0

如果有一件事bash不是特别擅长处理文本。我认为你会发现将这项工作委托给Python,Perl或awk更容易。 – nsfyn55

+1

看起来你在那里有一些流浪'$' - 'VERSION = $ {VERSION_LINE#version =}' –

回答

1

这可能是您的文件中都有回车。您可以通过在文件上运行dos2unix来解决此问题。

您可能还可以对正在检索的字符串进行即时处理。

这里有几种方法:

sed,而不是grep做它:

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

,你会不会需要猛砸参数扩展剥去“版本=”。

OR

执行grep因为你现在拥有它,并做了第二个参数扩展剥离回车。

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

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

+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 

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

从这句话:从一个字符串中

在某些情况下,它完美的作品,但在其他的字符与其他替代,而不是事后被放置的字符。

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

干杯, 贾科莫

+0

随着你的代码,行为仍然是一样的。 让我与这个例子中更解释错误详细: 版本3.2.1 = 构建= 87 excpected输出: 3.2.1-87 实际输出 -87.1 这是因为如果所述第二串( -87)被放置在“第一刺的开始之上”,即前三个字母被第二个字符替换。 –

相关问题