从某些文件中读取字符串时,连接字符串会失败。
从某些文件中读取字符串时,连接字符串会失败。
我有一个部署在服务器上的Web应用程序。我正在尝试创建一个脚本,其中包括从与应用程序一起部署的属性文件中读取当前版本的操作。
该文件的格式如下:
//其他内容 version=[版本号] build=[构建号] //其他内容
我想创建一个变量,格式如下:版本号-构建号
以下是我的脚本:
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}
奇怪的是,这在某些情况下有效,但在其他情况下却无效。
我遇到的问题是在尝试连接字符串时(即上面的最后一行)。在某些情况下它能完美运行,但在其他情况下,一个字符串的字符会替换另一个字符串的字符,而不是被放置在后面。
以下情况下它无法正常工作:
- 当我从部署的文件中读取时
- 如果我将部署的文件复制到另一个位置并从那里读取
以下情况下它可以正常工作:
- 如果我从头开始编写一个文件并从其中读取。
- 如果我创建自己的文件,然后将部署文件的内容复制到我的创建文件中。
我觉得这非常奇怪。有没有人遇到过类似的情况?
问题原因:在某些文件中读取时,连接字符串的操作会失败。
解决方法:根据提供的例子,通过使用awk命令来提取版本和构建号,并将它们连接成一个版本-构建字符串。
在处理文件时,有时候连接字符串的操作会失败,特别是在某些文件中读取时。下面是一个例子,展示了如何使用awk命令来提取版本号和构建号,并将它们连接成一个版本-构建字符串。
给定如下的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
然而,有些情况下,连接字符串的操作并不能如预期地工作。下面是一句话,描述了出现的问题:
> 在某些情况下,它可以完美地工作,但在其他情况下,一个字符串的字符代替了另一个字符串的字符,而不是被放置在其后面。
根据这个描述,很难理解实际发生了什么(可能是我的英语不好)。下面是一个更详细的例子来解释这个错误:
version=3.2.1 build=87 期望的输出: 3.2.1-87 实际输出: -87.1
似乎第二个字符串(-87)被放置在了第一个字符串(3.2.1)的开头位置,取代了前面的3个字符。
以上是关于连接字符串失败的原因以及解决方法的整理。希望对你有帮助!
拼接字符串在从某些文件中读取时会失败的原因可能是文件中含有回车符。您可以通过在文件上运行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'}
顺便说一句,我建议习惯性地使用小写或混合大小写的变量名,以减少名称冲突的可能性。