Поделиться через


Различия между языками сценариев

При работе с командами 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".

Правила языка сценариев

Ниже приведены краткие ссылки на правила языка сценариев, опубликованные соответствующими организациями:

Примечание.

Из-за известной проблемы в PowerShell применяется ряд дополнительных правил по использованию escape-символов. Дополнительные сведения см. в разделе "Рекомендации по запуску Azure CLI" на языке сценариев PowerShell.

См. также

Дополнительные сравнения языка сценариев см. в следующих статьях: