Jenkins

grep 在管道腳本腳本中的 shell 命令上

  • April 8, 2019

當我想創建幾個 shell 命令時,我的腳本管道返回第一個命令的答案而不執行管道。這是我的情況:我想在 HTML 頁面上獲取特定內容。所以我在頁面上捲曲,然後是 grep,最後是 awk。

def checkState(hostUri, check) {
 node('master') {
   def result = sh 'curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} && grep ${check} && awk -F \'"\' {\'print $2\'}'
   println result
}

只有我的管道的控制台返回對應只執行curl命令而不執行grep和awk。

Running on Jenkins in /var/lib/jenkins/workspace/Clearcase@8
[Pipeline] {
[Pipeline] sh
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
...
</html>
[Pipeline] }
[Pipeline] // node

我嘗試了不同的方法,例如使用腳本管道中不存在'''的命令。new BuildProcess

在所示的 Jenkinsfile 中,變數賦值涉及一個 shell 步驟:

def result = sh 'curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} && grep ${check} && awk -F \'"\' {\'print $2\'}'

此時 Jenkins 將呼叫一個 shell,並將以下命令傳遞給它:

curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} && grep ${check} && awk -F '"' {'print $2'}

&&運算符表示 AND 列表。在這種情況下,如果curl命令成功,則grep執行命令,如果成功,則執行awk命令。這些命令的標準輸入/輸出/錯誤流沒有相互連接。

由於這裡的目的是解析curl使用grepandawk語句的輸出,因此應該使用管道而不是&&運算符:

def result = sh 'curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} | grep ${check} | awk -F \'"\' {\'print $2\'}'

考慮引用hostUri&check變數,以防您最終在這些欄位中使用特殊字元。

最後一點:如果沒有文件名參數或某種輸入,命令grep ${check}&在技術上是不完整的。awk -F '"' {'print $2'}如果您從 shell 終端按原樣執行它們,它們只會卡住。但是,由於 Jenkins 以非互動方式執行建構過程,我假設他們的標準輸入流是從/dev/null. 在這種情況下,grep命令將失敗並顯示非零錯誤程式碼。

引用自:https://unix.stackexchange.com/questions/511211