經過Shell腳本讀取properties文件中的參數時遇到\r換行符的問題

今天在編寫微服務程序啓動腳本的時候,遇到一個比較奇葩的問題,下面給出具體描述:java

目標:經過讀取maven插件打包時生成的pom.properties文件,獲取裏面的應用名稱和應用版本號,而後拼接獲得serviceName-version.jar格式的jar包名稱,從而經過java -jar -xx..  jarPath的方式啓動linux

遇到的問題:經過shell腳本讀取pom.properties文件時,因爲其key-value格式分行存儲,在linux中獲取到的value值最後有一個\r參數(能夠經過sh -x  app.sh查看到),致使拼接到的jarName跟預期的不一致shell

pom.properties中的內容以下:編程

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

最初寫的讀取pom.properties中參數拼接JAR的shell腳本以下:app

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"

這樣輸出的結果以下:maven

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的問題,以後經過spa

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

即可以成功啓動咱們的服務了,但願對遇到這類問題的童鞋有幫助,問題很簡單,可是發現問題確實比較難,尤爲對shell不熟悉的小白而言。插件

相關文章
相關標籤/搜索