2016-08-18 78 views
1

我想在Jenkins(v。2.17)構建步驟'Execute shell'中讀取gradle.properties文件中工件ID的值。Jenkins報告構建shell語法錯誤,但在bash中沒有錯誤

線要讀的是這樣的:artifactId = myArtifact

腳本命令我使用:

ARTIFACT_ID=$((grep -Po "(?<=^artifactId).*" gradle.properties) | tr -d '=' | tr -d ' ') 

詹金斯作業失敗,此錯誤:

/tmp/hudson7118904411564834774.sh: 19: /tmp/hudson7118904411564834774.sh: Syntax error: Missing '))'

然而,我可以在作業的工作空間目錄中的相同構建機器上正確執行此命令行,並且在bash中有適當的用戶,而且我沒有語法錯誤!爲什麼它不在詹金斯工作?

我知道這條線因爲之前和之後的調試輸出而失敗。沒有改變目錄命令,即。腳本的工作目錄仍然是作業的工作空間目錄。

+1

你爲什麼試圖在子shell中運行'grep'(括號中的分組表示你正在嘗試執行)?你根本不需要那些內在的圓括號。延斯解釋了你爲什麼會遇到語法錯誤;我不確定代碼是如何工作的 - 它不應該被我的清算(但我承認只是作爲Bash用戶而不是Bash程序)。 –

回答

0

這一個花了我一段時間!似乎詹金斯的外殼不喜歡我的括號。此命令按預期工作:

ARTIFACT_ID=$(grep -Po "(?<=^artifactId).*" gradle.properties | tr -d '=' | tr -d ' ') 
+0

有沒有「詹金斯殼」;詹金斯使用你的系統的外殼。 – Jens

2

的問題是,$((算術擴展開始,作爲用於$((x + y)),它需要一個終止))令牌。如果你想在一個命令替換子shell,使用一個額外的空間,以避免令牌$((進行組合:

ARTIFACT_ID=$((grep ...) ...) 

喬納森萊弗勒正確地指出,在您的特定命令,(grep)子shell是無用的,被淘汰。