#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. Еще раз спасибо