Quotieren von Unterschieden zwischen Skriptsprachen
Artikel
Wenn Sie mit Azure CLI-Befehlen arbeiten, beachten Sie, wie Ihre Skriptsprache Anführungszeichen und Escapezeichen verwendet. Wenn Sie Skripts unterstützen, die in verschiedenen Shells verwendet werden, sparen Ihnen das Verständnis von Differenzen wertvolle Entwicklungsstunden.
Um unerwartete Ergebnisse mit Parameterwerten mit einfachen oder doppelten Anführungszeichen oder Escapezeichen zu vermeiden, sind hier einige Vorschläge:
Leerzeichen und Anführungszeichen
Wenn Sie einen Parameterwert angeben, der Leerzeichen enthält, umschließen Sie den Wert in Anführungszeichen.
Wenn Der Variablewert in Bash und PowerShell einfache Anführungszeichen enthält, umschließen Sie den Wert in doppelte Anführungszeichen und umgekehrt.
In Bash werden doppelte Anführungszeichen, die escaped sind, als Teil der Zeichenfolge behandelt.
In der Windows-Eingabeaufforderung werden Anführungszeichen innerhalb von Variablenwerten als Teil des Werts behandelt.
# CorrectmyVariable="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 stringmyVariable='my value with escaped \' \' single quotes wrapped in single quotes'# after each example ...
echo $myVariable
Die Bash-Ausgabe für die richtigen Beispiele lautet wie folgt:
Output
my string ' ' wrapped in double quotes
my string " " wrapped in single quotes
my string with escaped " " double quotes wrapped in double quotes
Wenn die in der Ausgabe enthaltenen Anführungszeichen enthalten sein sollen, escapeen Sie der Variablen wie folgt: echo \"$myVariable\".
Output
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"
Azure CLI
# Correct$myVariable = "my string ' ' wrapped in single quotes"$myVariable = 'my string " " wrapped in double quotes'# Wrong$myVariable = "my value with escaped `" `" double quotes"$myVariable = 'my value with escaped `' `' single quotes'# after each example ...
echo $myVariable
Die PowerShell-Ausgabe für die richtigen Beispiele lautet wie folgt:
Output
my string ' ' wrapped in double quotes
my string " " wrapped in single quotes
set myVariable="my value with ' ' single quotes"
set myVariable='my value with " " double quotes'
set myVariable="my second value with "" double quotes"
set myVariable='my second value with '' single quotes'# after each example ...
echo %myVariable%
Cmd.exe ist die einzige Skriptsprache in unseren Beispielen, die eingebettete Anführungszeichen zulassen, die mit dem Zeichenfolgenwrapper identisch sind. Beachten Sie jedoch auch, dass Cmd.exe die äußeren Anführungszeichen zurückgibt. Bash und PowerShell nicht.
Output
"my value with ' ' single quotes"
'my value with " " double quotes'
"my second value with " " double quotes"
'my second value with ' ' single quotes'
JSON-Zeichenfolgen
Verwenden Sie einfache Anführungszeichen, um den Inhalt in einer JSON-Zeichenfolge beizubehalten. Einfache Anführungszeichen sind erforderlich, wenn Inline-JSON-Werte bereitgestellt werden. Dieser JSON-Code ist beispielsweise sowohl in Bash als auch in PowerShell korrekt: '{"key": "value"}'.
Wenn Ihr Befehl über eine Windows-Eingabeaufforderung ausgeführt wird, müssen Sie doppelte Anführungszeichen verwenden. Das Äquivalent der obigen JSON-Zeichenfolge in Cmd.exe lautet "{"key":"value"}" .
Wenn der JSON-Wert doppelte Anführungszeichen enthält, müssen Sie diese escapen.
Beim Arbeiten mit JSON-Parameterwerten sollten Sie die Konvention der @<file> Azure CLI verwenden und die Interpretationsmechanismen der Shell umgehen.
Azure CLI
az ad app create --display-name myName --native-app--required-resource-accesses @manifest.json
Hier sind die akzeptierten JSON-Formatmuster für Bash, PowerShell und Cmd:
Unerwartetes Token ':"value"' im Ausdruck oder in der Anweisung
az {"key": "value"} --debug
Fehlende einfache Anführungszeichen und zusätzliches Leerzeichen
Fehler: Unerwartetes Token ':' im Ausdruck oder in der Anweisung
Verwenden Sie den Cmd-Befehl cls, um die Konsolenausgabe zwischen Tests zu entfernen.
Azure CLI
# Correct in Windows Command
az "{"key":"value"}"--debug
>> Command arguments: ['{key:value}', '--debug']
Diese drei Beispiele sind alle in Windows Command falsch .
Falsches Format
Problem
Konsolenausgabe
az "{"key":"value"}" --debug
Fehlende Escapezeichen
Befehlsargumente: ['{key:value}', '--debug']
az '{"key":"value"}' --debug
Fehlende Escapezeichen, Verwendung einfacher Anführungszeichen, wo doppelte Anführungszeichen erwartet werden
Befehlsargumente: ["'{key:value}'", '--debug']
az {"key":"value"} --debug
Fehlende Escapezeichen und doppelte Anführungszeichen
Befehlsargumente: ['{key:value}', '--debug']
Leere Zeichenfolgen
Verwenden Sie '""'in PowerShell, wenn ihr Wert eine leere Anführungszeichenzeichenfolge ('') ist.
Verwenden Sie in Bash oder PowerShell, wenn ihr Wert eine leere Anführungszeichenzeichenfolge ('') "''"ist.
Azure CLI
# Correct in BashmyVariable="''"# Correct in PowerShell$myVariable = "''"$myVariable = '""'
Durch Leerzeichen getrennte Werte
Einige Azure CLI-Befehle verwenden eine Liste mit durch Leerzeichen getrennten Werten. Wenn der Schlüsselname oder -wert Leerzeichen enthält, umschließen Sie das gesamte Paar: "my key=my value". Beispiel:
Azure CLI
az web app config app settings set --resource-group myResourceGroup --name myWebAppName --settings"client id=id1""my name=john"
Wenn ein CLI-Parameter angibt, dass er eine durch Leerzeichen getrennte Liste akzeptiert, wird eines von zwei Formaten erwartet:
Beispiel für nicht angesetzte, durch Leerzeichen getrennte Liste: --parameterName firstValue secondValue
Beispiel für eine durch Leerzeichen getrennte Liste: --parameterName "firstValue" "secondValue"
In diesem Beispiel handelt es sich um eine Zeichenfolge mit einem Leerzeichen darin. Es handelt sich nicht um eine durch Leerzeichen getrennte Liste: --parameterName "firstValue secondValue"
Sonderzeichen
Es gibt Sonderzeichen in der PowerShell-Skriptsprache, z. B. bei @. Fügen Sie zum Ausführen der Azure CLI in PowerShell ` als Escapezeichen vor dem Sonderzeichen ein. Sie können den Wert auch in einfache oder doppelte Anführungszeichen "/" setzen.
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
Bindestriche
Beginnt der Wert eines Parameters mit einem Bindestrich, versucht die Azure CLI, ihn als Parameternamen zu analysieren. Wenn Sie ihn als Wert analysieren möchten, verwenden Sie =, um den Parameternamen und den Wert zu verketten: --password="-VerySecret".
Der --query Parameter
Bei Verwendung des Parameters --query mit einem Befehl müssen einige Zeichen von JMESPath in der Shell mit Escapezeichen versehen werden.
Diese drei Befehle sind korrekt und führen in Bash zum gleichen Ergebnis:
Azure CLI
az version --query'"azure-cli"'az version --query \"azure-cli\"
az version --query "\"azure-cli\""
Hier sind zwei Beispiele für falsche Befehle in Bash:
Azure CLI
# Wrong, as the dash needs to be quoted in a JMESPath queryaz 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 Bashaz version --query"azure-cli"
az version: error: argument --query: invalid jmespath_type value: 'azure-cli'
Diese fünf Befehle funktionieren ordnungsgemäß in PowerShell:
Azure CLI
az version --query'\"azure-cli\"'az version --query"\`"azure-cli\`""az version --query"\""azure-cli\"""
az --% version --query "\"azure-cli\""
az --% version --query \"azure-cli\"
Diese beiden Befehle funktionieren in der Windows-Eingabeaufforderung ordnungsgemäß:
Azure CLI
az version --query"\"azure-cli\""az version --query \"azure-cli\"
Die beste Möglichkeit zur Behandlung eines Problems mit Anführungszeichen ist die Ausführung des Befehls mit dem Flag --debug. Mit diesem Flag werden die Argumente, die von der Azure CLI tatsächlich empfangen werden, in Python-Syntax angezeigt.
Die Quelle für diesen Inhalt finden Sie auf GitHub, wo Sie auch Issues und Pull Requests erstellen und überprüfen können. Weitere Informationen finden Sie in unserem Leitfaden für Mitwirkende.
Feedback zu Azure CLI
Azure CLI ist ein Open Source-Projekt. Wählen Sie einen Link aus, um Feedback zu geben:
Lernen Sie die grundlegenden Konzepte von Infrastructure-as-Code kennen, erkunden Sie die wichtigsten Unterschiede zwischen der Azure-Befehlszeilenschnittstelle (Azure Command Line Interface, Azure CLI), Azure PowerShell, Bicep und Terraform, und entscheiden Sie, welche Befehlszeilentools die Anforderungen Ihrer Organisation am besten erfüllen.