Попытка использовать команду Azure CLI в цикле выполнения сбой (работает вне цикла)

#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?