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

Bash 从某些文件读取时,连接字符串失败,bash,Bash,我有一个部署到服务器的web应用程序。我正在尝试创建一个脚本,让Amoming other things从与应用程序一起部署的属性文件中读取web应用程序的当前版本 该文件如下所示: //other content version=[version number] build=[buildnumber] //other content 我想创建一个如下所示的变量:version buildnumber 以下是我的脚本: VERSION_FILE=myfile VERSION_LINE="$(

我有一个部署到服务器的web应用程序。我正在尝试创建一个脚本,让Amoming other things从与应用程序一起部署的属性文件中读取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}
奇怪的是,这在某些情况下有效,但在其他情况下无效。 我遇到的问题是当我试图连接字符串时(即上面的最后一行)。在某些情况下,它工作正常,但在另一些情况下,一个字符串中的字符替换另一个字符串中的字符,而不是放在后面

在以下情况下,它不起作用:

  • 当我从部署的文件中读取时
  • 如果我将部署的文件复制到另一个位置并从那里读取
在以下情况下,它不起作用:

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

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

鉴于此
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
我不知道你的脚本为什么不起作用。你能提供一个错误输出的例子吗

从这句话中:

在某些情况下,它工作正常,但在另一些情况下,一个字符串中的字符替换另一个字符串中的字符,而不是放在后面

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

干杯,
Giacomo

您的文件中可能包含回车符。您可以通过在文件上运行
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'}

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

你能重现它吗?你是否尝试过用
set-x
进行调试?看起来你有一些错误的
$
在那里--
VERSION=${VERSION#LINE#VERSION=}
@nsfyn55,我强烈反对。@LudwigMagnusson,要么用
dos2unix
转换CRNL文件,要么用
sed的/\r$/'
@nsfyn55过滤掉CR:对于您的代码,行为实际上还是一样的。让我用这个例子更详细地解释这个错误:version=3.2.1 build=87例外输出:3.2.1-87实际输出-87.1就好像第二个字符串(-87)被放置在第一个sting开头的“顶部”,即前3个字母被第二个字符串替换。这就完成了!非常感谢你。