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