Различия между языками сценариев
При работе с командами Azure CLI следует учитывать, как язык сценариев использует кавычки и экранирует символы. Если вы поддерживаете сценарии, используемые в разных оболочках, понимание различий в кавыках экономит ценные часы разработки.
Чтобы избежать непредвиденных результатов со значениями параметров, содержащими одинарные или двойные кавычки, или escape-символы, ниже приведены некоторые варианты.
Пробелы и кавычки
Если указать значение параметра, содержащее пробелы, оставьте значение в кавычки.
В Bash и PowerShell, если значение переменной содержит одинарные кавычки, заключите значение в двойные кавычки и наоборот.
В Bash двойные кавычки, которые экранируются, обрабатываются как часть строки.
В командной строке Windows кавычки внутри переменных обрабатываются как часть значения.
Вот несколько таких случаев.
# Correct
myVariable="my string ' ' wrapped in double quotes"
myVariable='my string " " wrapped in single quotes'
myVariable="my string with escaped \" \" double quotes wrapped in double quotes"
# Wrong, escaped single quotes in Bash are not treated as part of the string
myVariable='my value with escaped \' \' single quotes wrapped in single quotes'
# after each example ...
echo $myVariable
Выходные данные Bash для правильных примеров приведены следующим образом:
my string ' ' wrapped in double quotes
my string " " wrapped in single quotes
my string with escaped " " double quotes wrapped in double quotes
Если вы хотите, чтобы кавычки, включенные в выходные данные, экранируйте переменную следующим образом: echo \"$myVariable\"
echo \"$myVariable\"
"my string ' ' wrapped in double quotes"
echo \'$myVariable\'
'my string " " wrapped in single quotes'
echo \"$myVariable\"
"my string with escaped " " double quotes wrapped in double quotes"
Строки JSON
Используйте одинарные кавычки, чтобы сохранить содержимое внутри строки JSON. При предоставлении встроенных значений JSON необходимы одинарные кавычки. Например, этот КОД JSON правильно используется как в Bash, так и в PowerShell:
'{"key": "value"}'
Если команда выполняется в командной строке Windows, необходимо использовать двойные кавычки. Эквивалентом приведенной выше строки JSON в Cmd.exe является
"{"key":"value"}"
.Если значение JSON содержит двойные кавычки, их необходимо экранировать.
При работе со значениями параметров JSON рекомендуется использовать соглашение Azure CLI
@<file>
и обойти механизмы интерпретации оболочки.az ad app create --display-name myName --native-app --required-resource-accesses @manifest.json
Ниже приведены принятые шаблоны формата JSON для Bash, PowerShell и Cmd:
Используйте команду Bash clear
для удаления выходных данных консоли между тестами.
# Correct in Bash
az '{"key":"value"}' --debug
>> Command arguments: ['{"key":"value"}', '--debug']
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'] |
Пустые строки
В PowerShell, если значение является пустой строкой кавычки (
''
), используйте'""'
.В Bash или PowerShell, если значение является пустой строкой кавычки (
''
), используйте"''"
.# Correct in Bash myVariable="''" # Correct in PowerShell $myVariable = "''" $myVariable = '""'
Значения, разделенные пробелами
Некоторые команды Azure принимают список значений, разделенных пробелами. Если имя ключа или значение содержат пробелы, заключите в кавычки всю пару: "my key=my value"
. Например:
az web app config app settings set --resource-group myResourceGroup --name myWebAppName --settings "client id=id1" "my name=john"
Если параметр CLI утверждает, что принимает разделенный пробелами список, ожидается один из таких двух форматов:
Пример неквотированного списка, разделенного пробелами:
--parameterName firstValue secondValue
Пример разделенного пробелами списка:
--parameterName "firstValue" "secondValue"
Этот пример представляет собой строку с пробелом в ней. Это не разделенный пробелами список: --parameterName "firstValue secondValue"
Специальные символы
Существуют специальные символы на языке сценариев PowerShell, например в @
. Чтобы выполнить команды Azure CLI в PowerShell, добавьте `
перед каждым специальным символом, чтобы экранировать его. Вы также можете целиком заключить значение в одинарные или двойные кавычки "
/"
.
# The following three examples will work in PowerShell
--parameterName `@parameters.json
--parameterName '@parameters.json'
--parameterName "@parameters.json"
# This example will not work in PowerShell
--parameterName @parameters.json
Символы дефиса
Если значение параметра начинается с дефиса, Azure CLI пытается анализировать его как имя параметра. Чтобы проанализировать его как значение, используйте =
для сцепления имения параметра со значением: --password="-VerySecret"
.
Параметр --query
Если вы используете в команде параметр --query
, некоторые символы JMESPath нужно экранировать в оболочке.
Следующие три команды в Bash корректны и эквивалентны:
az version --query '"azure-cli"'
az version --query \"azure-cli\"
az version --query "\"azure-cli\""
Ниже приведены два примера неправильных команд в Bash:
# Wrong, as the dash needs to be quoted in a JMESPath query
az version --query azure-cli
az version: error: argument --query: invalid jmespath_type value: 'azure-cli'
# Wrong, as the dash needs to be quoted in a JMESPath query, but quotes are interpreted by Bash
az version --query "azure-cli"
az version: error: argument --query: invalid jmespath_type value: 'azure-cli'
Дополнительные примеры сравнения между Bash, PowerShell и Cmd см. в статье "Запрос выходных данных команды Azure CLI".
Параметр --debug
Лучший способ устранить проблему с кавычками — выполнить команду с флагом --debug
. Этот флаг позволяет отобразить реальные полученные аргументы Azure CLI с использованием синтаксиса Python.
Дополнительные сведения об устранении неполадок с --debug
командами Azure CLI см. в статье "Устранение неполадок Azure CLI".
Правила языка сценариев
Ниже приведены краткие ссылки на правила языка сценариев, опубликованные соответствующими организациями:
- Язык скриптов Bash: правила кворирования Bash
- Язык сценариев PowerShell: правила кворирования PowerShell
- Командная строка Windows: практическое руководство. Escape-символы, разделители и кавычки в командной строке Windows
Примечание.
Из-за известной проблемы в PowerShell применяется ряд дополнительных правил по использованию escape-символов. Дополнительные сведения см. в разделе "Рекомендации по запуску Azure CLI" на языке сценариев PowerShell.
См. также
Дополнительные сравнения языка сценариев см. в следующих статьях: