недопустимый символ тела строки после знака доллара: либо экранирует буквальный знак доллара » $ 5″, либо заключает выражение значения в квадратные скобки

#git #jenkins #groovy #gitlab #jenkins-pipeline

# #git #дженкинс #groovy #gitlab #дженкинс-конвейер

Вопрос:

я пытаюсь выполнить проверку git в конвейере Дженкинса и пытаюсь выяснить только добавление строк в параллельный файл. однако меня мучает ошибка со знаком доллара в имени динамической ветки, но то же самое работало в другом месте конвейера. единственное новое дополнение к коду — это строка git diff, чтобы найти только добавление новых строк в конкретный файл. Можете ли вы помочь мне достичь этого?

рабочий код:

 script{
    withCreentials(...){
    
        sh returnStdout: true, script: """
            gwit checkout -B ${env.branch}
            git config user.name 'xxx'
            git config user.email 'xxx@xxx.com'
            git add sample.txt
            git commit -m "updated from pipeline"
            git push origin HEAD:${env.branch}
        
        """
    }

}
 

не рабочий код:

 script{
    withCreentials(...){
        sh returnStdout: true, script: """
            git checkout -B ${env.branch}
            git config user.name 'xxx'
            git config user.email 'xxx@xxx.com'
            git diff HEAD^:sample.txt HEAD:sample.txt --color=always|perl -wine 'print $1 if /^e[32m e[me[32m(.*)e[m$/'> output.txt
        
    }

}
 

ошибка :

 illegal string boy character
solution: either escape a literal dollar sign "$5" or bracket the value expression "${5}" 
    git  checkout -B ${env.branch}
                                 ^
 

Комментарии:

1. Вы могли бы начать с разделения вашей многострочной команды на несколько однострочных команд и посмотреть, какая строка вызывает проблему.

2. Если я удалю команду git diff, как упоминалось выше … все работает нормально.. но когда я добавляю его, ошибка указывает на строку оформления заказа.. именно поэтому трудно понять проблему

3. Ваша строка имеет print $1 и ошибка говорит either escape a literal dollar sign "$5" or bracket the value expression "${5}" . Вы пробовали исправить, как предполагает сообщение об ошибке?

4. Tried..no удачи .. но я уверен, что проблема связана с экранированием в команде git diff … с которой я до сих пор не мог разобраться

Ответ №1:

Это действительно распространенная ошибка, в основном при использовании тройных двойных кавычек вам нужно удалить все $ , кроме тех, которые вы хотите расширить как часть интерполяции переменных.

Однако Groovy выводит ошибку в одном из первых вхождений $ вместо фактического места, где у вас есть ошибка

В вашем случае строка с проблемами

 git diff HEAD^:sample.txt HEAD:sample.txt --color=always|perl -wine 'print $1 if /^e[32m e[me[32m(.*)e[m$/'> output.txt
 

У вас есть $1 и [m$ . Решение будет заключаться в том, чтобы избежать их.

С другой стороны, вам нужно будет избежать любой обратной реакции, которая потребуется сценарию

Официальная документация http://docs.groovy-lang.org/latest/html/documentation/index.html#all-strings