Bash 从某些文件读取时,连接字符串失败
我有一个部署到服务器的web应用程序。我正在尝试创建一个脚本,让Amoming other things从与应用程序一起部署的属性文件中读取web应用程序的当前版本 该文件如下所示:Bash 从某些文件读取时,连接字符串失败,bash,Bash,我有一个部署到服务器的web应用程序。我正在尝试创建一个脚本,让Amoming other things从与应用程序一起部署的属性文件中读取web应用程序的当前版本 该文件如下所示: //other content version=[version number] build=[buildnumber] //other content 我想创建一个如下所示的变量:version buildnumber 以下是我的脚本: VERSION_FILE=myfile VERSION_LINE="$(
//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个字母被第二个字符串替换。这就完成了!非常感谢你。