Сведения о различиях синтаксиса Azure CLI в Bash, PowerShell и Cmd

Команды Azure CLI можно выполнять как в средах Bash, PowerShell, так и в командной оболочке Windows (Cmd). Однако существуют различия в сценариях подтиля. На этом шаге руководства вы узнаете, как создать первые служба хранилища Azure учетные записи и форматировать значения параметров для всех трех сред.

Необходимые компоненты

  • Вы выполнили предварительные требования для подготовки среды.
  • У вас есть доступ к группе ресурсов с contributor разрешениями или более высокими разрешениями на уровне группы ресурсов.

Помните о символах продолжения строки

Большая часть документации по Azure CLI написана и протестирована в Bash с помощью Azure Cloud Shell. Одним из первых вещей, которые следует помнить при копировании синтаксиса Azure CLI, является проверка символов продолжения строки для выбранной среды, так как они не взаимозаменяемы.

Среда Символ продолжения строки
Bash Обратная косая черта (\)
PowerShell Backtick (`)
CMD Морковь (^)

Совет

Кнопка "Копировать " в правом верхнем углу блоков кода Azure CLI удаляет обратную косую черту (\) и обратную косую черту (`) с помощью конструктора. Если вы хотите скопировать форматированный блок кода, используйте клавиатуру или мышь для выбора и копирования примера.

Общие сведения о различиях синтаксиса при использовании переменных

Синтаксис для использования переменных немного отличается между средами. Ниже приведено сравнение:

Вариант использования Bash PowerShell Cmd
Создать переменную variableName=varValue $variableName="varValue" set variableName=varValue
Использование переменной в качестве значения параметра variableName $variableName %variableName%
Использование переменной в --query параметре "$variableName" "$variableName" "$variableName"

Существует несколько различных способов возврата сведений о переменных на экран консоли, но echo в большинстве случаев работает. Ниже приведено сравнение:

  • Bash: эхо $varResourceGroup
  • PowerShell: эхо $varResourceGroup
  • Cmd: echo %varResourceGroup%

На шаге 3 заполните переменные для использования в скриптах, вы работаете с подробными примерами синтаксиса переменных.

Сведения о различиях между средами

Каждый параметр Azure CLI — это строка. Однако каждая среда имеет собственные правила для обработки отдельных и двойных кавычки, пробелов и значений параметров.

«Строковое значение» Azure CLI PowerShell Cmd
Текст 'text' или "text" 'text' или "text" "text"
Число \'50\' ''50'' '50'
Логический \'true\' ''false'' 'true'
Дата '2021-11-15' '2021-11-15' '2021-11-15'
JSON "{"key":"value"}" или "{"key":"value"}" "{"key":"value"}" "{"key":"value"}"

Многие параметры Azure CLI принимают разделенный пробелом список значений. Это влияет на цитату.

  • Неквотированный список пробелов: --parameterName firstValue secondValue
  • Разделенный пробелами список: --parameterName "firstValue" "secondValue"
  • Значения, содержащие пробел: --parameterName "value1a value1b" "value2a value2b" "value3"

Если вы не знаете, как ваша строка будет оцениваться вашей средой, верните значение строки в консоль или используйте --debug , как описано в командах справки по Azure CLI отладки.

Создание учетной записи хранения для применения полученных вами знаний

Оставшаяся часть этого руководства демонстрирует правила кворирования в командах Azure CLI и использует группу ресурсов, созданную в разделе "Подготовка среды для Azure CLI". Замените <msdocs-tutorial-rg-00000000> именем группы ресурсов.

Создайте учетную запись хранения Azure для использования в этом руководстве. В этом примере присваивается случайный идентификатор имени учетной записи хранения, но если вы хотите использовать другое имя, ознакомьтесь с служба хранилища обзором правил имени учетной записи хранения.

В следующем примере скрипта демонстрируется синтаксис для конкретной среды для следующего вида:

  • Продолжение строки
  • Использование переменной
  • Случайные идентификаторы
  • Команда echo
# Variable block
let "randomIdentifier=$RANDOM*$RANDOM"
location=eastus
resourceGroup="<msdocs-tutorial-rg-00000000>"
storageAccount="msdocssa$randomIdentifier"

# Create a storage account.
echo "Creating storage account $storageAccount in resource group $resourceGroup"
az storage account create --name $storageAccount \
                          --resource-group $resourceGroup \
                          --location $location \
                          --sku Standard_RAGRS \
                          --kind StorageV2 \
                          --output json

Azure CLI возвращает более 100 строк JSON в виде выходных данных при создании новой учетной записи хранения. Следующие выходные данные словаря JSON содержат поля, опустимые для краткости.

{
"accessTier": "Hot",
"allowBlobPublicAccess": false,
"creationTime": "yyyy-mm-ddT19:14:26.962501+00:00",
"enableHttpsTrafficOnly": true,
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/ msdocs-tutorial-rg-00000000/providers/Microsoft.Storage/storageAccounts/msdocssa00000000",
"keyCreationTime": {
  "key1": "yyyy-mm-ddT19:14:27.103127+00:00",
  "key2": "yyyy-mm-ddT19:14:27.103127+00:00"
},
"kind": "StorageV2",
"location": "eastus",
"name": "msdocssa00000000",
"primaryEndpoints": {
  "blob": "https://msdocssa00000000.blob.core.windows.net/"
},
"primaryLocation": "eastus",
"provisioningState": "Succeeded",
"resourceGroup": "msdocs-tutorial-rg-00000000",
"sku": {
  "name": "Standard_RAGRS",
  "tier": "Standard"
},
"statusOfPrimary": "available",
"statusOfSecondary": "available",
"tags": {},
"type": "Microsoft.Storage/storageAccounts"
}

Создание тегов для практики различий в кавыках

С помощью az storage account update добавьте теги, которые помогут вам определить учетную запись хранения и узнать о различиях в кавыках. В этих примерах скриптов демонстрируется синтаксис, характерный для конкретной среды, для следующего:

  • Значения, содержащие пробелы
  • Кавыкание пустых пробелов
  • Экранирование специальных знаков
  • Использование переменных

Параметр --tags принимает разделенный пробелом список пар key:value. Замените <msdocs-tutorial-rg-00000000> именем группы ресурсов и <msdocssa00000000> именем учетной записи хранения Azure.

# Create new tags. This syntax works with or without quotes around each key-value pair.
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags Team=t1 Environment=e1

# Create new tags containing spaces. You must use quotes.
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags "Floor number=f1" "Cost center=cc1"

# Create a new tag with an empty value.
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags "Department="''""

# Create a new tag containing special characters resulting in "Path": "$G:\\myPath".
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags "Path=\$G:\myPath"

# Create a tag from a variable.
newTag="tag1=tag value with spaces"
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags "$newTag"

Если вы не хотите перезаписать предыдущие теги во время работы с этим руководством, используйте команду az tag update , чтобы задать --operation параметр merge.

# Get the resource ID of your storage account.
saID=$(az resource show --resource-group <msdocs-tutorial-rg-00000000> \
                        --name <msdocssa00000000> \
                        --resource-type Microsoft.Storage/storageAccounts \
                        --query "id" \
                        --output tsv)

echo My storage account ID is $saID

# Append new tags.
az tag update --resource-id $saID \
              --operation merge \
              --tags <tagName>=<tagValue>

# Get a list of all tags.
az tag list --resource-id $saID

Сравнение сценариев, относящихся к среде

Более подробно рассмотрим эти различия сценариев. В этих примерах демонстрируются различия в кавыках для следующих вариантов:

  • Передача строки JSON в качестве значения параметра
  • Фильтрация результатов с --query помощью параметра
    • Числа
    • Логические значения
    • Даты

Пример параметра, содержащего строку JSON. Этот скрипт предоставляется для дальнейшего использования, так как мы не работаем с az rest этим руководством.

az rest --method patch \
        --url https://management.azure.com/subscriptions/<mySubscriptionID>/resourceGroups/<myResourceGroup>/providers/Microsoft.HybridCompute/machines/<machineName>?api-version=yyyy-mm-dd-preview \
        --resource https://management.azure.com/ \
        --headers Content-Type=application/json \
        --body '{"properties": {"agentUpgrade": {"enableAutomaticUpgrade": false}}}'

Пример фильтрации для числового значения. Если у вас нет виртуальной машины в текущей подписке, этот пример будет указан для последующей ссылки.

az vm list --resource-group <myResourceGroup> \
           --query "[?storageProfile.osDisk.diskSizeGb >=\`50\`].{Name:name, admin:osProfile.adminUsername, DiskSize:storageProfile.osDisk.diskSizeGb}" \
           --output table

Пример фильтрации логического значения с помощью учетной записи хранения, созданной в этом руководстве.

az storage account list --resource-group <msdocs-tutorial-rg-00000000> \
    --query "[?allowBlobPublicAccess == \`true\`].id"

Примеры фильтрации даты с помощью учетной записи хранения, созданной в этом руководстве.

# include time
az storage account list --resource-group <msdocs-tutorial-rg-00000000> \
    --query "[?creationTime >='2021-11-15T19:14:27.103127+00:00'].{saName:name, saID: id, sku: sku.name}"

# exclude time
az storage account list --resource-group <msdocs-tutorial-rg-00000000> \
    --query "[?creationTime >='2021-11-15'].{saName:name, saID: id, sku: sku.name}"

# subtract days and use a variable
saDate=$(date +%F -d "-30days")
az storage account list --resource-group <msdocs-tutorial-rg-00000000> \
    --query "[?creationTime >='$saDate'].{saName:name, saID: id, sku: sku.name}"

Отладка ссылочных команд Azure CLI

Использование --debug параметра

Azure CLI предлагает --debug параметр, который можно использовать с любой командой. Выходные данные отладки обширны, но они предоставляют дополнительные сведения об ошибках выполнения. Используйте команду Bash clear для удаления выходных данных консоли между тестами.

Эти примеры показывают фактические аргументы, полученные Azure CLI в синтаксисе Python.

Этот пример является правильным как в Bash, так и в PowerShell.

az '{"key":"value"}' --debug

Узнайте, что azure CLI интерпретирует в Command arguments строке выходных данных.

Command arguments: ['{"key":"value"}', '--debug']

Этот второй пример также правильный. Используйте команду Bash clear для удаления выходных данных консоли между тестами.

clear
az "{\"key\":\"value\"}" --debug
Command arguments: ['{"key":"value"}', '--debug']

Следующие два примера неверны, так как кавычки и пробелы интерпретируются Bash.

Неправильный формат Проблема Вывод на консоль
az {"key":"value"} --debug Отсутствуют одиночные кавычки или escape-символы Аргументы команд: ['{key:value}', '--debug']
az {"key": "value"} --debug Отсутствующие одинарные кавычки или escape-символы и содержат дополнительное пространство Аргументы команд: ['{key:', 'value}', '--debug']

Использование echo команды

Несмотря --debug на то, что точно интерпретирует Azure CLI, второй вариант — возвратить значение выражения в консоль. Этот метод полезен при проверке результатов --query , которые подробно описаны в разделе "Заполнение переменных" для использования в скриптах.

strExpression='{"key":"value"}'
echo $strExpression
{"key":"value"}

Устранение неполадок

Ниже приведены распространенные ошибки при неправильном написании синтаксиса ссылочной команды Azure CLI:

  • "Неправильный запрос ... {что-то} недопустимо" может быть вызвано пробелом, одним или двойным кавычками или отсутствием кавычки.

  • "Непредвиденный токен..." отображается, когда есть дополнительное пространство или цитата.

  • Ошибка "Недопустимая jmespath_type значение" часто возникает из неправильного кавыка в параметре --query .

  • "Ссылка на переменную недопустима" получается, если строка не форматируется должным образом из-за объединения или отсутствующих escape-символов.

  • Нераспознанные аргументы часто вызваны неправильным символом продолжения строки.

  • "Отсутствует выражение после унарного оператора" отображается, когда отсутствует символ продолжения строки.

Дополнительные сведения

Хотите подробнее об одном из тем, описанных на этом шаге руководства? Чтобы узнать больше, воспользуйтесь ссылками в этой таблице.

Тема Подробнее
Различия в скриптах Bash quoting
Цитата PowerShell
Проблемы с кавыканиями в PowerShell
Советы по командной строке Windows
Параметры Использование кавычки в параметрах Azure CLI
Дополнительные примеры синтаксиса Bash, PowerShell и Cmd в выходных данных команды запроса с помощью JMESPath

Следующий шаг

Теперь, когда вы узнали, как написать синтаксис Azure CLI для Bash, PowerShell и Cmd, перейдите к следующему шагу, чтобы узнать, как извлечь значения в переменную.