今天在编写微服务程序启动脚本的时候,遇到一个比较奇葩的问题,下面给出具体描述:

目标:通过读取maven插件打包时生成的pom.properties文件,获取里面的应用名称和应用版本号,然后拼接得到serviceName-version.jar格式的jar包名称,从而通过java -jar -xx..  jarPath的方式启动

遇到的问题:通过shell脚本读取pom.properties文件时,由于其key-value格式分行存储,在linux中获取到的value值最后有一个\r参数(可以通过sh -x  app.sh查看到),导致拼接到的jarName跟预期的不一致

pom.properties中的内容如下:

version=1.0
groupId=project.parent
artifactId=com.lxk.cms.admin.service

最初写的读取pom.properties中参数拼接JAR的shell脚本如下:

JAR=""
if [ -z "$JAR" ];then
if [ -f "$APP_HOME/pom.properties" ];then
. $APP_HOME/pom.properties
echo "artifactId=$artifactId"
echo "version=$version"
JAR="$artifactId-$version.jar"
fi
fi
echo "the app jar name is: $JAR"

这样输出的结果如下:

artifactId=com.lxk.cms.admin.service
version=1.0
.jar app jar name is :com.lxk.cms.admin.service

半天也搞不懂为啥会有这样的输出结果,网上查找相关的shell编程资料,读取properties文件都是获取里面的参数变量值,很少有遇到拼接时这种问题的,最后在一位shell老司机的博客里面看到可以通过在执行脚本的命令中加入-x参数来获取详细的执行过程,照着这个方法执行,果然看到了在第一次echo输出artifactId的值后面有一个\r,在输出的时候echo函数自己处理掉了,所以在输出的结果中看不到换行的效果,version的值也是一样,最后也有一个\r,找到问题的所在以后,就去查找如何去掉变量后面的\r方法,这时sed函数便出现在眼前,使用也很简单,改进后的shell脚本如下:

JAR=""
if [ -z "$JAR" ];then
if [ -f "$APP_HOME/pom.properties" ];then
. $APP_HOME/pom.properties
ver=$(echo $version | sed 's/\r//')
art=$(echo $artifactId | sed 's/\r//')
JAR="$art-$ver.jar"
fi
fi
echo "the app jar name is :$JAR"

改进后输出的结果如下:

artifactId=com.lxk.cms.admin.service
version=1.0
the app jar name is:com.lxk.cms.admin.service-1.0.jar

这样就成功了解决了获取jarName的问题,之后通过

$JAVA_PATH $JAVA_OPTS -Dmx.config.path="$APP_HOME/etc/" -jar "$APP_HOME/lib/$JAR"

便可以成功启动我们的服务了,希望对遇到这类问题的童鞋有帮助,问题很简单,但是发现问题确实比较难,尤其对shell不熟悉的小白而言。

通过Shell脚本读取properties文件中的参数时遇到\r换行符的问题的更多相关文章

  1. Mac下通过shell脚本修改properties文件

    通过shell脚本替换属性文件中的某行记录 假设有如下属性文件 demo.properties user.name=test user.password=123456 ................ ...

  2. Java中读取txt文件中中文字符时,出现乱码的解决办法

    这是我写的一个Java课程作业时,遇到的问题. 问题描述: 我要实现的就是将txt文件中的内容按一定格式读取出来后,存放在相应的数组. 我刚开始运行时发现,英文可以实现,但是中文字符就是各种乱码. 最 ...

  3. shell 脚本sed替换文件中某个字符串

    有些大文件,特别的大.有几百兆,甚至更大. 用文本编辑器打开十分的费劲,电脑都卡死了. 想替换其中的字符串,很麻烦. 这个时候有了shell,简直强大到爆炸! # du -h user.sql 304 ...

  4. java读取properties文件中参数值

    在类文件中加入代码: //config.properties.sysInfo //sysInfo.properties在文件夹的路径为/src/config/properties/sysInfo.pr ...

  5. 读取yml 文件中的参数

    第一种方法: yml 文件: spring: main: allow-bean-definition-overriding: true cloud: consul: host: 192.168.1.1 ...

  6. 注解形式读取properties文件中的属性

    1.spring.xml中加入(多个properties 用逗号隔开)  <context:property-placeholder location="classpath:jdbc. ...

  7. maven src/test/resources 下的logback-test.xml 读取 properties文件中的key-value值

    <profiles>        <profile>            <id>test-cd</id>            <prope ...

  8. shell 脚本,提取文件中的内容

    使用awk.cut.sed.if.while 等 awk.cut.sed还是很重要的 这是后来修改的,可以完成 #!/bin/bash #conver formatFILE=mobile_dpi.ru ...

  9. shell脚本,如果文件中的第一列有相同的,就把相同的那些行的其他字段相加

    命令:awk '{a[$1]+=$2}{b[$1]+=$3}END{for(i in a){print i,a[i],b[i]}}'

随机推荐

  1. 快速构建Windows 8风格应用12-SearchContract概述及原理

    原文:快速构建Windows 8风格应用12-SearchContract概述及原理 本篇博文主要介绍Search Contract概述.Search Contract面板结构剖析.Search Co ...

  2. 快速构建Windows 8风格应用24-App Bar构建

    原文:快速构建Windows 8风格应用24-App Bar构建 本篇博文主要介绍构建AppBar基本步骤.如何构建AppBar.如何在AppBar中构建上下文命令.如何在AppBar中构建菜单.如何 ...

  3. Tomcat7.0更改默认的路径来访问自己的项目

    如何使自己的项目没有输入:localhost:8080/项目名称/index.html 能够访问. 步骤,如下面的 : 找到tomcat ---  config----server.xml 选中右键编 ...

  4. linux下getrusage()

    #include <sys/resource.h> /* Return resource usage information on process indicated by WHOand ...

  5. 代码审查 (Google牛人谈Code Review)

    代码审查 (Google牛人谈Code Review) 在上一篇博客里我暗示自己将不在为Google工作. 我还没有决定好去哪儿-有几个非常不错的工作机会让我选择.鉴于这段时间内我不受雇于任何公司,我 ...

  6. SongTaste音乐下载器

    SongTaste音乐下载器 Songtaste是一个非常好的音乐推荐网站, 奈何和duomi搅合在一起, 导致下载音乐非常的麻烦, 现在写了一个简单的"下载器", 通过它可以下载 ...

  7. iOS基础 - 通知中心(NSNotificationCenter)

    通知中心(NSNotificationCenter) 每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信 任何一个对象都可以向通知中心发 ...

  8. 附加被分离DB

    如何附加被分离的质疑数据库?   简介 有些时间,由于日志损坏等原因,导致了数据库质疑.如果此时你分离了数据库,那你会发现你无法再附加上数据库,那后果还是很严重的.因此本文提供了一种方式,可以使得当数 ...

  9. Hashtable Dictionary List

    Hashtable Dictionary List 谁效率更高   一 前言 很少接触HashTable晚上回来简单看了看,然后做一些增加和移除的操作,就想和List 与 Dictionary比较下存 ...

  10. 模块化开发AraeRegistration

    .NET/ASP.NET MVC(模块化开发AraeRegistration) 阅读目录: 1.开篇介绍 2.AreaRegistration注册路由(传递路由上下文进行模块化注册) 1]开篇介绍 A ...