Операторы соответствия условий If else не работают внутри оболочки jenkinsfile

#shell #if-statement #jenkins-pipeline

#оболочка #if-оператор #дженкинс-конвейер

Вопрос:

У меня есть приведенное ниже утверждение на одном из шагов в Jenkinsfile

  steps {
sh '''
file=/sql/common/file1.sql
echo $file
if ["$file" = *"/common"* ]; then
  echo "changes found in common directory "
fi
'''
}
 

По какой-то причине оболочка не работает должным образом внутри jenkinsfile. как мы
сравниваем строки в оболочке в Jenkinsfile? есть ли у нас какой-либо конкретный синтаксис для них? Дженкинс выдает ошибку, если я использую == оператор для сравнения строк.
Я предполагал, что оболочка должна работать таким же образом в Jenkinsfile, как только мы объявим ее внутри sh ''' . Разве это не так?

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

1. /sql/common/file1.sql не равно «/common», поэтому вы никогда не получите сообщение.

2. Да, это правильно. На самом деле, я хочу проверить, не работает ли шаблон (содержит ‘/ common/ ‘) и оператор ==, который мы используем в оболочке.

3. Вам нужно использовать =~ тогда

4. Спасибо, я попробовал это .. if [ «$file» = ~ .*»/ common/».* ]; получение ошибки ниже в jenkins [: /root: неожиданный оператор

5. После этого вы пропускаете пробел [ .

Ответ №1:

 ["$file"
 

является недействительным. Между [ аргументом и аргументом должен быть пробел. [ это команда.

 if [ "$file" = *"/common"* ];
 

это не значит того, что ты думаешь. *"/common"* подвергается расширению имени файла, поэтому оно заменяется списком файлов, соответствующих шаблону. Поскольку, скорее всего, существует много файлов, которые соответствуют расширению имени файла, [ программа завершается с какой-то синтаксической ошибкой.

Если вы хотите сопоставить строку с шаблоном в оболочке POSIX, либо используйте grep с регулярным выражением:

 if printf "%sn" "$file" | grep -q '.*/common.*'; then
 

или использовать case с глобусом:

 if case "$file" in *"/common"*) true; ;; *) false; ;; esac; then
 

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

1. Спасибо @KamilCuk , это то, что я искал, условие grep сработало для меня. В первом приведении даже с пробелом это условие не работало в оболочке jenkinsfile. Еще раз спасибо