bash
2017-02-11 76 views 1 likes 
1

我有一個奇怪的問題,我不知道爲什麼。我相信這可能與命令替換有關,但我沒有足夠的經驗來理解爲什麼。如何讓命令替換使用字符串連接?

拿這個腳本,例如:

#!/usr/bin/env bash 

MAJOR_VER="$(grep "version.major" application.properties | cut -d'=' -f2)" 
MINOR_VER="$(grep "version.minor" application.properties | cut -d'=' -f2)" 
PATCH_VER=3 

echo ${MAJOR_VER} 
echo ${MINOR_VER} 
echo ${PATCH_VER} 

echo "${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}" 

我得到的結果:

1 
2 
3 
.3 

所以前三回聲呼叫給予正確的信息;然而,每當我嘗試將它們連接在一起時,我只會得到最後一個出現。我會猜測這與命令替換直接相關,因爲如果我硬編碼MAJOR_VER和MINOR_VER的值,我會得到預期的結果。有人能向我解釋我在這裏做錯了什麼嗎?謝謝。

回答

1

文件application.properties有dos結束。用它轉換:

dos2unix application.properties 

觀察實驗:

$ cat script.sh 
#!/usr/bin/env bash 

MAJOR_VER="$(grep "version.major" application.properties | cut -d'=' -f2)" 
MINOR_VER="$(grep "version.minor" application.properties | cut -d'=' -f2)" 
PATCH_VER=3 

echo ${MAJOR_VER} 
echo ${MINOR_VER} 
echo ${PATCH_VER} 

echo "${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}" 

$ cat application.properties 
version.major=1 
version.minor=2 

$ cat -A application.properties 
version.major=1^M$ 
version.minor=2^M$ 

$ ./script.sh 
1 
2 
3 
.3 

$ ./script.sh | cat -A 
1^M$ 
2^M$ 
3$ 
1^M.2^M.3$ 

$ dos2unix application.properties 
dos2unix: converting file application.properties to Unix format ... 

$ ./script.sh 
1 
2 
3 
1.2.3 
1

這可能是因爲application.properties\r\n代替\n結束行。會發生什麼變量包含末尾的\r,即MAJOR_VER的值爲1\r,而MINOR_VER的值爲2\r。當你echo他們,\r重置字符位置到行的開始,所以echo "1\r.2\r.3"的輸出將被打印爲.3

你可以使用tr -d刪除\r

MAJOR_VER=$(grep "version.major" application.properties | cut -d'=' -f2 | tr -d '\r') 
MINOR_VER=$(grep "version.minor" application.properties | cut -d'=' -f2 | tr -d '\r') 
+0

真棒。謝謝! – Sam

 相關問題

  • 暫無相關問題^_^