2012-05-07 114 views
3

我有一個部署到服務器的Web應用程序。我正在嘗試創建一個腳本,用於從與應用程序一起部署的屬性文件中讀取當前版本的Web應用程序。Bash:從某些文件讀取時連接字符串失敗

文件看起來是這樣的:

//other content 
version=[version number] 
build=[buildnumber] 
//other content 

我想創建一個變量,如下所示:version-buildnumber

這是我爲它的腳本:

VERSION_FILE=myfile 

VERSION_LINE="$(grep "version=" $VERSION_FILE)" 
VERSION=${VERSION_LINE#$"version="} 
BUILDNUMBER_LINE=$(grep "build=" $VERSION_FILE) 
BUILDNUMBER=${BUILDNUMBER_LINE#$"build="} 
THEVERSION=${VERSION}-${BUILDNUMBER} 

奇怪的這是否適用於某些情況,但不適用於其他情況。 我得到的問題是當我試圖連接字符串(即上面的最後一行)。在某些情況下,它可以很好地工作,但在其他情況下,一個字符串中的字符會替換另一個字符,而不是後來放置。

它在這些情況下工作:

  • 當我從部署文件中讀取
  • 如果我複製部署的文件到另一個位置,並從那裏

閱讀確實在這些情況下工作:

  • 如果我從頭開始編寫一個文件並從該文件讀取。
  • 如果我創建自己的文件,然後將部署文件中的內容複製到我創建的文件中。

我覺得這很奇怪。有沒有人認識到這一點?

/路德維希

+0

你可以重現嗎?,你嘗試用'set -x'調試嗎? – KurzedMetal

+0

如果有一件事bash不是特別擅長處理文本。我認爲你會發現將這項工作委託給Python,Perl或awk更容易。 – nsfyn55

+1

看起來你在那裏有一些流浪'$' - 'VERSION = $ {VERSION_LINE#version =}' –

回答

1

這可能是您的文件中都有回車。您可以通過在文件上運行dos2unix來解決此問題。

您可能還可以對正在檢索的字符串進行即時處理。

這裏有幾種方法:

sed,而不是grep做它:

VERSION_LINE="$(sed -n "/version=/{s///;s/\r//g;p}" $VERSION_FILE)" 

,你會不會需要猛砸參數擴展剝去「版本=」。

OR

執行grep因爲你現在擁有它,並做了第二個參數擴展剝離回車。

VERSION=${VERSION_LINE#$"version="} 
VERSION=${VERSION//$'\r'} 

順便說一句,我建議您習慣性地使用小寫或混合大小寫的變量名稱,以減少名稱衝突的可能性。

+0

這樣做! 非常感謝。 –

1

鑑於這種foo.txt

//other content 
version=[version number] 
build=[buildnumber] 
//other content 

你可以awk更容易提取版本構建字符串:

awk -F'=' '$1 == "version" { version = $2}; $1 == "build" { build = $2}; END { print version"-"build}' foo.txt 

我不知道爲什麼你的腳本沒有按沒有工作。你能提供一個錯誤輸出的例子嗎?

從這句話:從一個字符串中

在某些情況下,它完美的作品,但在其他的字符與其他替代,而不是事後被放置的字符。

我不明白實際發生了什麼(我不是英語母語的人,所以這可能是我的錯)。

乾杯, 賈科莫

+0

隨着你的代碼,行爲仍然是一樣的。 讓我與這個例子中更解釋錯誤詳細: 版本3.2.1 = 構建= 87 excpected輸出: 3.2.1-87 實際輸出 -87.1 這是因爲如果所述第二串( -87)被放置在「第一刺的開始之上」,即前三個字母被第二個字符替換。 –

相關問題