#bash #azure-devops #azure-pipelines
Вопрос:
У меня есть шаблон конвейера, который я вызываю, чтобы просмотреть список значений параметров, которые мне нужно разделить и назначить двум переменным для моей задачи, потому что я не могу использовать многомерные массивы в конвейерах Azure 🙁
Вопрос в следующем: как мне получить текущее значение, которое цикл представляет в bash, чтобы выполнить с ним действие?
Пример:
parameters:
- name: NameAndID
type: object
default: []
- name: jobsToRun
type: string
default: ''
jobs:
- job: DoTheThing
displayName: "Update with val A and val B"
steps:
- ${{ each p in parameters.NameAndID }}:
?? << assign Bash accessible variable 'NAME_ID' to ${{ p }} >> ??
- bash:
AF=$NAME_ID | cut -d '~' -f1)
echo "##vso[task.setvariable variable=AF_NAME]$AF"
PROJ=$NAME_ID | cut -d '~' -f2)
echo "##vso[task.setvariable variable=PROJ_NUM]$PROJ"
Таким образом, предполагая, что переданные значения параметров являются:
A~1
B~2
C~3
...
Для каждого экземпляра сценарий должен создавать переменные
Loop 1
$AF_NAME = A
$PROJ_NUM = 1
Loop 2
$AF_NAME = B
$PROJ_NUM = 2
Loop 3
$AF_NAME = C
$PROJ_NUM = 3
и так далее…
Так что шаг, который я не могу понять, это
<< назначьте переменную, доступную для bash, $ {{p }} >< назначьте переменную, доступную для bash, $ {{p }} >>
Как я могу присвоить новое значение ${{ p }} переменной, которую bash может считывать каждый раз, когда происходит цикл?
Кроме того, я довольно зелен в этом вопросе, так что будьте конкретны, пожалуйста. 🙂
ТИА
Фреймиш
Ответ №1:
Как мне получить текущее значение, которое цикл представляет в bash, чтобы выполнить с ним действие?
Вы можете использовать следующий скрипт в bash:
NAME_ID=${{ p }}
Тогда переменная NAME_ID
будет иметь значение параметра в текущем цикле.
Вот мой тестовый сценарий:
trigger: none
pool:
vmImage: ubuntu-latest
parameters:
- name: NameAndID
type: object
default:
- A~1
- B~2
- C~3
jobs:
- job: DoTheThing
displayName: "Update with val A and val B"
steps:
- ${{ each p in parameters.NameAndID }}:
- bash: |
NAME_ID=${{ p }}
AF=$( echo "$NAME_ID" | cut '-d~' "-f1" )
PROJ=$( echo "$NAME_ID" | cut '-d~' "-f2" )
echo "$NAME_ID"
echo "$AF"
echo "$PROJ"
И это прекрасно работает:
Комментарии:
1. Это сработало! Большое спасибо. Один из последующих вопросов: почему одинарные и двойные кавычки в этой
cut '-d~' "-f1"
части?2. @Freymish В этом нет необходимости, и вместо этого вы можете использовать свои команды вырезания! 🙂 Я не знаком с bash и напрямую использую команды в учебнике.