Оболочка Bash: Как получить имена логических переменных в виде строки

#bash #shell #jenkins

Вопрос:

 for bool in $jobdummyjob1 $jobdummyjob2 $jobdummyjob3
do
echo "Boolean Value is $bool"
    if "$bool" ; then 
        echo "$alljobs"
        curl -X POST https://jenkins.delasport.com/job/$bool/build --user veselin.tonchev@delasport.com:11880a2d5164f159e10c61e77cc416e311
    fi
done
 

Все, что мне нужно, это каким-то образом взять имена jobdummyjob1, 2, 3 и поместить их в URL-адрес в виде строки. Эти переменные являются логическими, поэтому, когда я это делаю, я получаю значение true или false в URL. Мне нужно не значение переменной, а ее имя.

Сначала я запускаю «для» и просматриваю каждый объект. Каждый объект содержит логическое значение. Затем я выполняю проверку true/false, и если это правда, мне нужно получить строковое имя той же переменной и поместить его в URL-адрес . Это работа Дженкинса.

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

1. Это не проблема «Дженкинса». Это просто оболочка интерполирует переменную в цикле, поэтому она передает значения. Вы хотите «перебирать имена переменных, а не значения». Множество ответов , если вы ищете это.

2. Это не то, что мне было нужно. Я отправил мне, как напечатать имя переменной, и это здорово, и я это знаю. Мне нужно понять, как напечатать имя и значение одной и той же логической переменной/. Сначала мне понадобится значение true или false, затем мне понадобится его имя.

Ответ №1:

Вы можете использовать косвенное использование переменных:

 for name in jobdummyjob1 jobdummyjob2 jobdummyjob3
do
bool=${!name}
echo "Boolean Value is $bool"
    if "$bool" ; then 
        echo "$alljobs"
        curl -X POST https://jenkins.delasport.com/job/"$name"/build --user veselin.tonchev@delasport.com:11880a2d5164f159e10c61e77cc416e311
    fi
done
 

Но чище использовать ассоциативный массив:

 declare -A bools
bools=([jobdummyjob1]=true [jobdummyjob2]=false [jobdummyjob3]=true)
for name in "${!bools[@]}" ; do
    bool=${bools[$name]}
    if ...
done
 

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

1. Третий вариант: Используйте подстановочный знак имени переменной (если все соответствующие переменные имеют, например, один и тот же хорошо известный префикс имени). jobdummyjob1=true; jobdummyjob2=false; jobdummyjob3=true; for var in "${!jobdummyjob@}"; do echo "${var}=${!var}"; done (Недостатком является то, что у вас нет такого большого контроля над порядком итераций.)

2. К сожалению, я попробовал ваше предложение, но безуспешно. Я копаюсь в поисках подстановочного знака и начинаю думать, что Дженкинс не поддерживает подстановочные переменные

3. Какая часть-Дженкинс, а какая часть-баш?

4. Я заставил его работать с этим сценарием, но я столкнулся с другой проблемой, которая, я надеюсь, должна быть последней: проблема в том, что если имя логической переменной начинается с числа или имеет некоторые специальные символы, как в случае с «18dummyjob» и «18-job.com-тест», оно каким-то образом исключается, и Дженкинс говорит, что: /tmp/jenkins18288022382660040755.sh: 13: /tmp/jenkins18288022382660040755.sh: dummyjob: не найдено Числа буквально пропущены, что изменяет значение переменной. У вас есть какие-либо идеи о том, какую строковую операцию я мог бы использовать в этом случае? Также теряется логическое значение.

5. код для bool в $jobdummyjob1 $jobdummyjob2 $jobdummyjob3 $18dummyjob делать countOuter=$((countOuter 1)) имя в jobdummyjob1 jobdummyjob2 jobdummyjob3 18dummyjob делать countInner=$((countInner 1)) Если [ «$countOuter» -ЭК «$countInner» ] amp;amp; «$боол»; затем локон -х пост Дженкинс. delasport.com/job/$имя/сборка —пользователь veselin.tonchev@delasport.com:11880a2d5164f159e10c61e77cc416e311 эхо «ПОКАЗАТЬ БУЛ — — — — — — — $бул» Подсчет=0, сделано Подсчет=0 сделано «код»