今天在編寫微服務程序啓動腳本的時候,遇到一個比較奇葩的問題,下面給出具體描述: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不熟悉的小白而言。插件