Udostępnij za pośrednictwem


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ą --debugprogramu , 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:

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: