Мне нужен оператор if в Jenkins Execute Shell, но он всегда терпит неудачу в одной и той же строке, независимо от того, что там есть. Я пытаюсь сделать что-то вроде этого:
if [ " ${BuildVariants[*]} " =~ " VariantA " ]; then
# fails on this line even this line is just a comment
variant_config = ""
fi
он терпит неудачу, когда я пытаюсь назначить переменную там, терпит неудачу, когда я пытаюсь echo "anything"
, терпит неудачу даже в комментарии (как пример выше)
Причина: Bad substitution
Примечание. В «Настроить систему» указано что-либо, поэтому следует использовать Bash по умолчанию.
В чем может быть проблема?
Затем вы запускаете сценарии оболочки в конвейере jenkins, он все еще использует синтаксис groovy. Предположим, вам нужно использовать «\» для отображения специальных символов.
@user1934428 user1934428 да, именно в этом и была проблема - я предполагал, что Дженкинс давал мне массив, но он давал строку. Благодарю вас! Он инициализируется расширенным параметром выбора с несколькими вариантами выбора.
Я не думаю, что Дженкинс технически могу передает вам массив. Ваш сценарий запускается как дочерний процесс, и нет общего механизма для передачи массивов в качестве параметров процессам.
Я не думаю, что =~
работает внутри [ ... ]
— вместо этого используйте [[ ... ]]
.
Шеллчек — отличный инструмент для поиска таких вещей; это покажет, что вы нажали SC2074.
повторно:
fails on this line even this line is just a comment
У вас не может быть «пустого» блока then
. Вы можете использовать только :
в качестве кода для выполнения:
if [[ "$foo" == "bar" ]]; then
:
fi
Следующая идея: заставить ваш код запускаться в сценарии оболочки, а затем поместить код в Jenkins. Для этого вам, вероятно, потребуется смоделировать часть входных данных, предоставленных Дженкинсом, но это уберет еще одну движущуюся часть уравнения. Если код запускается из командной строки, а не в Jenkins, то вам нужно начать искать причины, характерные для Jenkins, например, возможно, он запускается в csh вместо Bash (я вижу, вы уже упоминали об этой конкретной возможности, но, может быть, есть что-то еще подобное - я не знаю Дженкинса, извините).
Я пробовал [[ ... ]]
тоже самое. Должен был упомянуть об этом
Спасибо за Ваш ответ! Проблема была именно в том, что я пытался запустить команду в онлайн-инструменте bash и издевался над некоторыми входными данными :sweat_smile: там мой скрипт работал, но не в Jenkins. Я предполагал, что Дженкинс давал мне массив, но он давал строку. Итак, теперь я получаю [[: not found
ошибку, но, по крайней мере, эта Bad substitution
исправлена, ха-ха, еще раз спасибо за помощь!
Ошибка [[: not found
предполагает, что она работает в оболочке, отличной от bash (вероятно, dash).
@GordonDavisson [[: not found
это было исправлено после того, как я добавил #!/bin/bash
в начале командного окна (не уверен, что это подтверждает ваше предложение). Спасибо в любом случае!
Итак, проблема была в том, что я предполагал, что Дженкинс дает мне массив, но он дает мне строку. (Я использовал с Расширенный параметр выбора, с несколькими вариантами).
Так что условие должно было быть [[ "$BuildVariants" == *"VariantA"* ]]
.
Помимо правильного ответа, данного Джо Касадонте, я бы запустил код с включенным
set -x
, чтобы увидеть, что происходит, и сделалecho $BASH_VERSION
в вашем скрипте, чтобы убедиться, что вы действительно используете bash. Далее, вы уверены, что действительно хотите искать подстроку Вариант А, в окружении пространств?, Также вы убедились, чтоBuildVariants
является массивом? Я не понимаю, как вы инициализируете эту переменную. Наконец, я не думаю, что вы публикуете сообщение об ошибке полный.