我有一个部署到服务器的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}
奇怪的是,这在某些情况下有效但在其他情况下则无效。 我得到的问题是当我试图连接字符串时(即上面的最后一行)。在某些情况下,它可以很好地工作,但在其他情况下,一个字符串中的字符会替换另一个字符,而不是之后的字符。
在这些情况下不工作:
确实在这些情况下工作:
我发现这很奇怪。是否有人认识到这一点?
/路德维希
答案 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'}
顺便说一句,我建议习惯使用小写或混合大小写变量名称,以减少名称冲突的可能性。