#bash #azure #shell #azure-devops #azure-cli
#bash #azure #оболочка #azure-devops #azure-cli
Вопрос:
Я пытаюсь использовать некоторые команды Azure cli в цикле выполнения. Команды работают вне цикла. Я не могу понять, почему они возвращают null вне цикла.
`az login --service-principal **creds removed**
displayName=$(az ad app list --all | jq '. [] .displayName')
for name in $displayName;
do
echo $name
az ad app list --all --display-name $name | jq ".[0] .passwordCredentials[0].endDate"
done`
Например, одним из отображаемых имен является boss-app, если я сделаю следующее
az ad app list --all --display-name "boss-app" | jq ".[0] .passwordCredentials[0].endDate"
"2228-02-34T25:50:41.324437 00:00
Даже если я помещаю полную команду в цикл, она правильно выводит дату, кажется, что когда я пытаюсь использовать переменную $name, она не работает.
Прошу прощения, если это вопрос для новичков.
Комментарии:
1. Есть ли пробелы в каком-либо из отображаемых имен?
2. Нет, они начинаются и заканчиваются кавычками.
3. Есть еще обновления для вопроса? Решает ли это вашу проблему?
4. Привет, Чарльз, я пытался опубликовать, но он был удален. При назначении отображаемого имени в качестве значения name оно также заключало json в кавычки. Удаление кавычек вокруг этого и выполнение той же команды решило проблему. Меня это несколько смутило, поскольку запуск команды со значением имени в кавычках непосредственно в оболочку сработал. Также я не уверен, почему команда обработала и не выдала ошибку, если она не видела значение отображаемого имени. Спасибо за вашу помощь в решении этой проблемы.
5. Существуют и другие способы решения проблемы. Ключ в том, что вам нужно знать, как оболочка определяет переменную списка. В этом проблема. Мой ответ просто показывает вам один способ. Если вы хотите узнать другие способы, пожалуйста, добавьте комментарии под моим ответом, и тогда мы сможем общаться в чате. И если это работает для вас, пожалуйста, примите это как ответ.
Ответ №1:
Вы можете изменить сценарий на это:
az login --service-principal **creds removed**
for name in $(az ad app list --all | jq '. [] .displayName')
do
echo $name
az ad app list --all --display-name $name | jq ".[0] .passwordCredentials[0].endDate"
done
Ответ №2:
Поскольку вы отфильтровали приложение ad с --display-name
помощью in the loop, я думаю, вам следует изменить код в цикле следующим образом, не указывая индекс массива [0]
:
az login --service-principal **creds removed**
displayName=$(az ad app list --all | jq '. [] .displayName')
for name in $displayName;
do
echo $name
az ad app list --all --display-name $name | jq ".[] .passwordCredentials[].endDate"
done
Результат
Команда
Кроме того, если вы хотите использовать глобальный параметр Azure CLI --query
вместо jq
, вы можете использовать его, как показано ниже:
Обратите внимание, что попробуйте использовать двойные кавычки ""
для Windows, используйте одинарные кавычки ''
для ОС Linux в запросе.
az login --service-principal **creds removed**
displayName=$(az ad app list --all --query "[].displayName" -o tsv)
for name in $displayName;
do
echo $name
az ad app list --all --display-name $name --query "[].passwordCredentials[].endDate"
done
Комментарии:
1. Это не дало ожидаемого результата, он распечатал отображаемые имена name, но не более того.
2. Где вы запускаете Azure CLI?