Cytowanie różnic między językami skryptowymi
Podczas pracy z poleceniami interfejsu wiersza polecenia platformy Azure należy pamiętać, jak język skryptowy używa znaków cudzysłowu i znaków ucieczki. Jeśli obsługujesz skrypty używane w różnych powłokach, zrozumienie różnic w cudzysłów pozwala zaoszczędzić cenne godziny programowania.
Aby uniknąć nieprzewidzianych wyników z wartościami parametrów zawierającymi pojedyncze lub podwójne cudzysłowy lub znaki ucieczki, poniżej przedstawiono kilka sugestii:
Białe spacje i znaki cudzysłowu
Jeśli podasz wartość parametru zawierającą biały znak, zawijaj wartość w cudzysłowie.
W powłoce Bash i programie PowerShell, jeśli wartość zmiennej zawiera pojedyncze cudzysłowy, zawijaj wartość w cudzysłowach i odwrotnie.
W powłoce Bash cudzysłowy, które są ucieczki, są traktowane jako część ciągu.
W wierszu polecenia systemu Windows cudzysłowy wewnątrz wartości zmiennych są traktowane jako część wartości.
Oto kilka przykładów:
# 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
Dane wyjściowe powłoki Bash dla poprawnych przykładów są następujące:
my string ' ' wrapped in double quotes
my string " " wrapped in single quotes
my string with escaped " " double quotes wrapped in double quotes
Jeśli chcesz, aby cudzysłowy zawarte w danych wyjściowych uniknęły zmiennej w następujący sposób: 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"
Ciągi JSON
Użyj pojedynczych cudzysłowów, aby zachować zawartość wewnątrz ciągu JSON. Pojedyncze cudzysłowy są niezbędne podczas podawania wbudowanych wartości JSON. Na przykład ten kod JSON jest poprawny zarówno w powłoce Bash, jak i programie PowerShell:
'{"key": "value"}'
.Jeśli polecenie jest uruchamiane w wierszu polecenia systemu Windows, należy użyć podwójnych cudzysłowów. Odpowiednik powyższego ciągu JSON w Cmd.exe to
"{"key":"value"}"
.Jeśli wartość JSON zawiera cudzysłowy podwójne, należy je użyć jako ucieczki.
Podczas pracy z wartościami parametrów JSON rozważ użycie konwencji interfejsu wiersza polecenia
@<file>
platformy Azure i obejście mechanizmów interpretacji powłoki.az ad app create --display-name myName --native-app --required-resource-accesses @manifest.json
Poniżej przedstawiono akceptowane wzorce formatów JSON dla powłoki Bash, programu PowerShell i narzędzia Cmd:
Użyj polecenia powłoki clear
Bash, aby usunąć dane wyjściowe konsoli między testami.
# Correct in Bash
az '{"key":"value"}' --debug
>> Command arguments: ['{"key":"value"}', '--debug']
az "{\"key\":\"value\"}" --debug
>> Command arguments: ['{"key":"value"}', '--debug']
Te dwa następne przykłady są niepoprawne , ponieważ cudzysłowy i spacje są interpretowane przez powłokę Bash.
Nieprawidłowy format | Problem | Dane wyjściowe konsoli |
---|---|---|
az {"key":"value"} --debug | Brak pojedynczych cudzysłowów lub znaków ucieczki | Argumenty poleceń: ['{key:value}", '--debug'] |
az {"key": "value"} --debug | Brak pojedynczych cudzysłowów lub znaków ucieczki i zawiera dodatkowe miejsce | Argumenty poleceń: ['{key:', 'value}', '--debug'] |
Puste ciągi
W programie PowerShell, jeśli wartość jest pustym ciągiem cudzysłowów (
''
), użyj polecenia'""'
.W powłoce Bash lub programie PowerShell, jeśli wartość jest pustym ciągiem cudzysłowów (
''
), użyj polecenia"''"
.# Correct in Bash myVariable="''" # Correct in PowerShell $myVariable = "''" $myVariable = '""'
Wartości rozdzielane spacjami
Niektóre polecenia interfejsu wiersza polecenia platformy Azure przyjmują listę wartości rozdzielonych spacjami. Jeśli nazwa lub wartość klucza zawiera spacje, opakuj całą parę: "my key=my value"
. Na przykład:
az web app config app settings set --resource-group myResourceGroup --name myWebAppName --settings "client id=id1" "my name=john"
Gdy parametr interfejsu wiersza polecenia stwierdza, że akceptuje listę rozdzielaną spacją, oczekuje się jednego z dwóch formatów:
Przykład niekwotowanej listy rozdzielanej spacjami:
--parameterName firstValue secondValue
Przykład cytowanej listy rozdzielanej spacjami:
--parameterName "firstValue" "secondValue"
Ten przykład jest ciągiem z spacją w nim. Nie jest to lista rozdzielona spacjami: --parameterName "firstValue secondValue"
Znaki specjalne
W języku skryptów programu PowerShell istnieją znaki specjalne, takie jak .@
Aby uruchomić interfejs wiersza polecenia platformy Azure w programie PowerShell, dodaj `
przed znakiem specjalnym, aby go uniknąć. Można również ująć wartość w cudzysłów pojedynczych lub podwójnych "
/"
.
# 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
Znaki łącznika
Jeśli wartość parametru zaczyna się od łącznika, interfejs wiersza polecenia platformy Azure próbuje przeanalizować go jako nazwę parametru. Aby przeanalizować ją jako wartość, użyj polecenia =
, aby połączyć nazwę parametru i wartość: --password="-VerySecret"
.
Parametr --query
Jeśli używasz parametru --query
z poleceniem, niektóre znaki JMESPath muszą zostać uniknięte w powłoce.
Te trzy polecenia są poprawne i równoważne w powłoce Bash:
az version --query '"azure-cli"'
az version --query \"azure-cli\"
az version --query "\"azure-cli\""
Oto dwa przykłady nieprawidłowych poleceń w powłoce 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'
Aby uzyskać więcej przykładowych porównań między powłoką Bash, programem PowerShell i programem Cmd, zobacz Wykonywanie zapytań względem danych wyjściowych polecenia interfejsu wiersza polecenia platformy Azure.
Parametr --debug
Najlepszym sposobem rozwiązania problemu z cudzysłów jest uruchomienie polecenia z flagą --debug
. Ta flaga wyświetla rzeczywiste argumenty odebrane przez interfejs wiersza polecenia platformy Azure w składni języka Python.
Aby uzyskać więcej informacji na temat rozwiązywania problemów z poleceniami interfejsu wiersza polecenia platformy Azure za pomocą --debug
programu , zobacz Rozwiązywanie problemów z interfejsem wiersza polecenia platformy Azure.
Reguły języka skryptowego
Poniżej przedstawiono szybkie linki do reguł języka skryptów opublikowanych przez odpowiednie organizacje:
- Język skryptów powłoki Bash: reguły cytowania powłoki Bash
- Język skryptów programu PowerShell: Reguły cytowania programu PowerShell
- Wiersz polecenia systemu Windows: instrukcje: znaki ucieczki, ograniczniki i cudzysłowy w wierszu polecenia systemu Windows
Uwaga
Ze względu na znany problem w programie PowerShell obowiązują pewne dodatkowe reguły ucieczki. Aby uzyskać więcej informacji, zobacz Zagadnienia dotyczące uruchamiania interfejsu wiersza polecenia platformy Azure w języku skryptów programu PowerShell.
Zobacz też
Więcej porównań języka skryptów można znaleźć w następujących artykułach:
- Dowiedz się więcej o różnicach składniowych w samouczku powłoki Bash, programu PowerShell i narzędzia Cmd
- Wykonywanie zapytań względem danych wyjściowych polecenia interfejsu wiersza polecenia platformy Azure przy użyciu zapytania JMESPath
- Zagadnienia dotyczące uruchamiania interfejsu wiersza polecenia platformy Azure w języku skryptowym programu PowerShell