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


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

目標:通過讀取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不熟悉的小白而言。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM