Jak używać interfejsu wiersza polecenia platformy Azure w środowisku powłoki Bash

Polecenia referencyjne interfejsu wiersza polecenia platformy Azure mogą być wykonywane w kilku różnych środowiskach powłoki, ale usługa Microsoft Docs używa głównie środowiska powłoki Bash. Jeśli dopiero zaczynasz korzystać z powłoki Bash, a także interfejsu wiersza polecenia platformy Azure, ten artykuł stanowi doskonałe miejsce na rozpoczęcie nauki. Zapoznaj się z tym artykułem, podobnie jak w przypadku samouczka, aby dowiedzieć się, jak łatwo używać interfejsu wiersza polecenia platformy Azure w środowisku powłoki Bash.

W tym artykule omówiono sposób wykonywania następujących zadań:

  • Wyniki zapytania jako słowniki lub tablice JSON
  • Formatuj dane wyjściowe w formacie JSON, tabeli lub TSV
  • Wykonywanie zapytań, filtrowanie i formatowanie pojedynczych i wielu wartości
  • Użyj składni if/exists/then i case
  • Używanie pętli
  • Używanie poleceń grep, sed, paste i bc
  • Wypełnianie i używanie zmiennych środowiskowych i powłoki

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure.

Uruchamianie powłoki Bash

Uruchom powłokę Bash przy użyciu usługi Azure Cloud Shell lub lokalnej instalacji interfejsu wiersza polecenia platformy Azure. W tym artykule założono, że uruchamiasz powłokę Bash przy użyciu usługi Azure Cloud Shell lub uruchamiasz interfejs wiersza polecenia platformy Azure lokalnie w kontenerze platformy Docker.

Wykonywanie zapytań względem wyników słownika

Polecenie, które zawsze zwraca tylko pojedynczy obiekt, zwraca słownik JSON. Słowniki są nieurządzanymi obiektami, do których uzyskuje się dostęp za pomocą kluczy. W tym artykule zaczniemy od wykonywania zapytań względem obiektu Account przy użyciu polecenia Account Show .

az account show
az account show --output json # JSON is the default format

Następujące dane wyjściowe słownika JSON zawierają niektóre pola pominięte w celu zwięzłości, a identyfikowanie informacji zostało usunięte lub zgeneryzowane.

bash-5.1# az account show
{
  "environmentName": "AzureCloud",
  "isDefault": true,
  "managedByTenants": [],
  "name": "My test subscription",
  "state": "Enabled",
  "user": {
    "name": "user@contoso.com",
    "type": "user"
  }
}

Formatowanie danych wyjściowych jako YAML

Użyj argumentu --output yaml (lub -o yaml), aby sformatować dane wyjściowe w formacie yaml , format serializacji danych w postaci zwykłego tekstu. Pliki YAML są łatwiejsze do odczytania niż pliki JSON i można je łatwo mapować na ten format. Niektóre aplikacje i polecenia interfejsu wiersza polecenia przyjmują format danych wejściowych konfiguracji YAML, zamiast formatu JSON.

az account show --output yaml

Aby uzyskać więcej informacji na temat formatowania danych wyjściowych jako yaml, zobacz Format danych wyjściowych YAML.

Formatowanie danych wyjściowych jako tabeli

Użyj argumentu --output table (lub -o table), aby sformatować dane wyjściowe jako tabelę ASCII. Dane wyjściowe tabeli nie zawierają obiektów zagnieżdżonych, ale można je filtrować w ramach zapytania.

az account show --output table

Aby uzyskać więcej informacji na temat formatowania danych wyjściowych jako tabeli, zobacz Format danych wyjściowych tabeli.

Wykonywanie zapytań i formatowanie pojedynczych wartości i wartości zagnieżdżonych

Poniższe zapytania pokazują wykonywanie zapytań dotyczących pojedynczych wartości, w tym wartości zagnieżdżonych w danych wyjściowych słownika JSON. Ostatnie zapytanie w tym zestawie demonstruje formatowanie danych wyjściowych przy użyciu argumentu -o tsv . Ten argument zwraca wyniki jako wartości rozdzielane tabulatorami i nowymi wierszami. Ta akcja jest przydatna do usuwania cudzysłowów w zwróconej wartości — co jest przydatne do użycia danych wyjściowych w innych poleceniach i narzędziach, które muszą przetworzyć tekst w jakiejś formie (jak pokazano w dalszej części tego artykułu).

az account show --query name # Querying a single value
az account show --query name -o tsv # Removes quotation marks from the output

az account show --query user.name # Querying a nested value
az account show --query user.name -o tsv # Removes quotation marks from the output

Wykonywanie zapytań i formatowanie właściwości z tablic

Poniższe zapytanie demonstruje pobieranie właściwości w tablicy JSON. Pobierz właściwości subskrypcji wyświetlane jako tabela subskrypcji.

az account list --query "[].{subscription_id:id, name:name, isDefault:isDefault}" -o table

To zapytanie zwraca wyniki podobne do następujących:

Subscription_id                       Name                                               IsDefault
------------------------------------  -------------------------------------------------  -----------
11111111-3ddc-45ce-8334-c7b28a9e1c3a  C & L Azure developer experience content projects  False
22222222-8f1c-409b-af1e-8e2e65d9b90a  DevCenter - Infrastructure - Dogfood               False
33333333-c080-42a7-8973-1aa853ab4df3  Babel                                              False

Wykonywanie zapytań i formatowanie wielu wartości, w tym wartości zagnieżdżonych

Aby uzyskać więcej niż jedną właściwość, umieść wyrażenia w nawiasach kwadratowych [ ] (lista wielokrotnego wyboru) jako listę rozdzielaną przecinkami. Poniższe zapytania przedstawiają wykonywanie zapytań dotyczących wielu wartości w danych wyjściowych słownika JSON przy użyciu wielu formatów wyjściowych.

az account show --query [name,id,user.name] # return multiple values
az account show --query [name,id,user.name] -o table # return multiple values as a table

Aby uzyskać więcej informacji na temat zwracania wielu wartości, zobacz Pobieranie wielu wartości.

Zmienianie nazw właściwości w zapytaniu

Poniższe zapytania przedstawiają użycie operatora { } (skrót wielowybierz) w celu pobrania słownika zamiast tablicy podczas wykonywania zapytań dotyczących wielu wartości. Demonstruje również zmianę nazw właściwości w wyniku zapytania.

az account show --query "{SubscriptionName: name, SubscriptionId: id, UserName: user.name}" # Rename the values returned
az account show --query "{SubscriptionName: name, SubscriptionId: id, UserName: user.name}" -o table # Rename the values returned in a table

Aby uzyskać więcej informacji na temat zmieniania nazw właściwości w zapytaniu, zobacz Zmienianie nazw właściwości w zapytaniu.

Wykonywanie zapytań dotyczących wartości logicznych

Przyjmuje się, że wartości logiczne mają wartość true, więc "[?isDefault]" składnia zapytania dla az account list polecenia zwraca bieżącą subskrypcję domyślną. Aby uzyskać wartości fałszywe, należy użyć znaku ucieczki, takiego jak \.

Poniższe zapytania przedstawiają wykonywanie zapytań dotyczących wszystkich kont w subskrypcji, potencjalnie zwracając tablicę JSON, jeśli istnieje wiele subskrypcji dla danego konta, a następnie wykonywanie zapytań dotyczących konta, dla którego konta jest subskrypcją domyślną. Demonstruje również wykonywanie zapytań dotyczących kont, które nie są subskrypcją domyślną. Te zapytania opierają się na tym, czego nauczyliśmy się wcześniej filtrować i formatować wyniki. Na koniec ostatnie zapytanie demonstruje przechowywanie wyników zapytania w zmiennej.

az account list
az account list --query "[?isDefault]" # Returns the default subscription
az account list --query "[?isDefault]" -o table # Returns the default subscription as a table
az account list --query "[?isDefault].[name,id]" # Returns the name and id of the default subscription
az account list --query "[?isDefault].[name,id]" -o table # Returns the name and id of the default subscription as a table
az account list --query "[?isDefault].{SubscriptionName: name, SubscriptionId: id}" -o table # Returns the name and id of the default subscription as a table with friendly names

az account list --query "[?isDefault == \`false\`]" # Returns all non-default subscriptions, if any
az account list --query "[?isDefault == \`false\`].name" -o table # Returns all non-default subscriptions, if any, as a table

az account list --query "[?isDefault].id" -o tsv # Returns the subscription id without quotation marks
subscriptionId="$(az account list --query "[?isDefault].id" -o tsv)" # Captures the subscription id as a variable.
echo $subscriptionId # Returns the contents of the variable.
az account list --query "[? contains(name, 'Test')].id" -o tsv # Returns the subscription id of a non-default subscription containing the substring 'Test'
subscriptionId="$(az account list --query "[? contains(name, 'Test')].id" -o tsv) # Captures the subscription id as a variable. 
az account set -s $subscriptionId # Sets the current active subscription

Tworzenie obiektów przy użyciu zmiennych i losowości

Ustawianie losowej wartości do użycia w kolejnych poleceniach

Ustawienie i użycie losowej wartości do użycia w zmiennych umożliwia wielokrotne uruchamianie skryptów bez konfliktów nazewnictwa. Konflikty nazewnictwa mogą wystąpić, ponieważ wartość musi być unikatowa w usłudze lub obiekt, który został usunięty, nadal istnieje na platformie Azure do czasu zakończenia procesu usuwania.

$RANDOM jest funkcją powłoki bash (a nie stałą), która zwraca losową 16-bitową liczbę całkowitą (z zakresu od 0 do 32767). Polecenie let to wbudowane polecenie powłoki Bash umożliwiające ocenę wyrażeń arytmetycznych. Użycie następującego polecenia powoduje utworzenie wystarczająco unikatowej wartości dla większości celów.

let "randomIdentifier=$RANDOM*$RANDOM"

Praca z spacjami i cudzysłowami

Spacje są używane do oddzielania poleceń, opcji i argumentów. Użyj cudzysłowów, aby poinformować powłokę powłoki Bash o ignorowaniu wszystkich znaków specjalnych, z których biały znak jest znakiem specjalnym. Gdy powłoka powłoki Bash widzi pierwszy znak cudzysłowu, ignoruje znaki specjalne do znaku cudzysłowu zamykającego. Jednak czasami chcesz, aby powłoka Bash analizować niektóre znaki specjalne, takie jak znaki dolara, cudzysłowy odwrotne i ukośniki odwrotne. W tym scenariuszu użyj cudzysłowów podwójnych.

Następujące polecenia używają polecenia az group create , aby zilustrować użycie pojedynczych i podwójnych cudzysłowów. Te polecenia służą do obsługi spacji i oceniania znaków specjalnych podczas pracy ze zmiennymi i tworzenia obiektu.

resourceGroup='msdocs-learn-bash-$randomIdentifier'
echo $resourceGroup # The $ is ignored in the creation of the $resourceGroup variable
resourceGroup="msdocs-learn-bash-$randomIdentifier"
echo $resourceGroup # The $randomIdentifier is evaluated when defining the $resourceGroup variable
location="East US" # The space is ignored when defining the $location variable
echo The value of the location variable is $location # The value of the $location variable is evaluated
echo "The value of the location variable is $location" # The value of the $location variable is evaluated
echo "The value of the location variable is \$location" # The value of the $location variable is not evaluated
echo 'The value of the location variable is $location' # The value of the $location variable is not evaluated
az group create --name $resourceGroup --location $location # Notice that the space in the $location variable is not ignored and the command fails as it treats the value after the space as a new command 
az group create --name $resourceGroup --location "$location" # Notice that the space in the $location variable is ignored and the location argument accepts the entire string as the value 

W danych wyjściowych słownika JSON przejrzyj właściwości utworzonej grupy zasobów.

Używanie instrukcji If Then Else w celu określenia, czy zmienna ma wartość null

Aby ocenić ciągi, użyj polecenia != i , aby oszacować liczby, użyj polecenia -ne. Poniższa instrukcja If Then Else ocenia, czy ustawiono zmienną $resourceGroup. Jeśli tak, zwraca wartość zmiennej. Jeśli nie, ustawia zmienną.

if [ $resourceGroup != '' ]; then
   echo $resourceGroup
else
   resourceGroup="msdocs-learn-bash-$randomIdentifier"
fi

Używanie polecenia If Then do utworzenia lub usunięcia grupy zasobów

Poniższy skrypt tworzy nową grupę zasobów tylko wtedy, gdy jedna z określoną nazwą jeszcze nie istnieje.

if [ $(az group exists --name $resourceGroup) = false ]; then 
   az group create --name $resourceGroup --location "$location" 
else
   echo $resourceGroup
fi

Poniższy skrypt usuwa istniejącą nową grupę zasobów, jeśli jedna z określoną nazwą już istnieje. Możesz użyć argumentu --no-wait , aby zwrócić kontrolę bez oczekiwania na ukończenie polecenia. Jednak w tym artykule chcemy poczekać na usunięcie grupy zasobów przed kontynuowaniem. Aby uzyskać więcej informacji na temat operacji asynchronicznych, zobacz Operacje asynchroniczne. Przedstawiamy użycie argumentu --no-wait na końcu tego artykułu.

if [ $(az group exists --name $resourceGroup) = true ]; then 
   az group delete --name $resourceGroup -y # --no-wait
else
   echo The $resourceGroup resource group does not exist
fi

Używanie języka Grep do określenia, czy grupa zasobów istnieje, i utwórz grupę zasobów, jeśli nie

Następujące polecenie potokuje dane wyjściowe az group list polecenia do grep polecenia . Jeśli określona grupa zasobów nie istnieje, polecenie tworzy grupę zasobów przy użyciu wcześniej zdefiniowanych zmiennych.

az group list --output tsv | grep $resourceGroup -q || az group create --name $resourceGroup --location "$location"

Używanie instrukcji CASE w celu określenia, czy grupa zasobów istnieje, i utwórz grupę zasobów, jeśli nie

Poniższa instrukcja CASE tworzy nową grupę zasobów tylko wtedy, gdy jedna z określoną nazwą jeszcze nie istnieje. Jeśli jedna z określoną nazwą istnieje, instrukcja CASE powtarza, że grupa zasobów istnieje.

var=$(az group list --query "[? contains(name, '$resourceGroup')].name" --output tsv)
case $resourceGroup in
$var)
echo The $resourceGroup resource group already exists.;;
*)
az group create --name $resourceGroup --location "$location";;
esac

Używanie pętli i wykonywania zapytań dotyczących tablic

W tej sekcji artykułu utworzymy konto magazynu, a następnie użyjemy pętli do tworzenia obiektów blob i kontenerów. Demonstrujemy również wykonywanie zapytań dotyczących tablic JSON i pracę ze zmiennymi środowiskowymi.

Tworzenie konta magazynu

Następujące polecenie używa polecenia az storage account create , aby utworzyć konto magazynu używane podczas tworzenia kontenerów magazynu.

storageAccount="learnbash$randomIdentifier"
az storage account create --name $storageAccount --location "$location" --resource-group $resourceGroup --sku Standard_LRS --encryption-services blob

Pobieranie kluczy konta magazynu

Następujące polecenia używają polecenia az storage account keys list , aby zwrócić wartości klucza konta magazynu. Następnie przechowujemy wartość klucza w zmiennej do użycia podczas tworzenia kontenerów magazynu.

az storage account keys list --resource-group $resourceGroup --account-name $storageAccount --query "[].value" -o tsv # returns both storage account key values

az storage account keys list --resource-group $resourceGroup --account-name $storageAccount --query "[0].value" -o tsv # returns a single storage account key value

accountKey=$(az storage account keys list --resource-group $resourceGroup --account-name $storageAccount --query "[0].value" -o tsv)

echo $accountKey

Tworzenie kontenera magazynu

Zaczniemy od utworzenia pojedynczego kontenera magazynu za pomocą polecenia az storage container create , a następnie użyjemy listy az storage container list , aby wykonać zapytanie o nazwę utworzonego kontenera.

container="learningbash"
az storage container create --account-name $storageAccount --account-key $accountKey --name $container

az storage container list --account-name $storageAccount --account-key $accountKey --query [].name

Przekazywanie danych do kontenera

Poniższy skrypt tworzy trzy przykładowe pliki przy użyciu pętli for.

for i in `seq 1 3`; do
    echo $randomIdentifier > container_size_sample_file_$i.txt
done

Poniższy skrypt używa polecenia az storage blob upload-batch , aby przekazać obiekty blob do kontenera magazynu.

az storage blob upload-batch \
    --pattern "container_size_sample_file_*.txt" \
    --source . \
    --destination $container \
    --account-key $accountKey \
    --account-name $storageAccount

Poniższy skrypt używa polecenia az storage blob list , aby wyświetlić listę obiektów blob w kontenerze.

az storage blob list \
    --container-name $container \
    --account-key $accountKey \
    --account-name $storageAccount \
    --query "[].name"

Poniższy skrypt wyświetla łączną liczbę bajtów w kontenerze magazynu.

bytes=`az storage blob list \
    --container-name $container \
    --account-key $accountKey \
    --account-name $storageAccount \
    --query "[*].[properties.contentLength]" \
    --output tsv | paste -s -d+ | bc`

echo "Total bytes in container: $bytes"
echo $bytes

Tworzenie wielu kontenerów przy użyciu pętli

Następnie utworzymy wiele kontenerów przy użyciu pętli demonstrujące kilka sposobów na zapisanie pętli.

for i in `seq 1 4`; do 
az storage container create --account-name $storageAccount --account-key $accountKey --name learnbash-$i
done

for value in {5..8}
for (( i=5; i<10; i++));
do
az storage container create --account-name $storageAccount --account-key $accountKey --name learnbash-$i
done

az storage container list --account-name $storageAccount --account-key $accountKey --query [].name

Używanie funkcji EXPORT do definiowania zmiennych środowiskowych

W poprzednich skryptach kontenera magazynu określiliśmy nazwę konta i klucz konta za pomocą każdego polecenia. Zamiast tego możesz przechowywać poświadczenia uwierzytelniania przy użyciu odpowiednich zmiennych środowiskowych: AZURE_STORAGE_ACCOUNT i AZURE_STORAGE_KEY. Aby wykonać tę akcję, użyj polecenia EXPORT.

export AZURE_STORAGE_ACCOUNT=$storageAccount
export AZURE_STORAGE_KEY=$accountKey
az storage container list # Uses the environment variables to display the list of containers.

Poniższy skrypt tworzy ciąg metadanych, a następnie używa polecenia az storage container metadata update , aby zaktualizować kontener za pomocą tego ciągu, ponownie przy użyciu zmiennych środowiskowych.

metadata="key=value pie=delicious" # Define metadata
az storage container metadata update \
    --name $container \
    --metadata $metadata # Update the metadata
az storage container metadata show \
    --name $containerName # Show the metadata

Następujące polecenie używa polecenia az storage container delete , aby usunąć jeden nazwany kontener, a następnie usunąć wiele kontenerów w pętli.

az storage container delete \
    --name $container

Pobierz listę kontenerów zawierających określony prefiks i zapisz wyniki w zmiennej.

containerPrefix="learnbash"
containerList=$(az storage container list \
    --query "[].name" \
    --prefix $containerPrefix \
    --output tsv)

Usuń listę kontenerów w pętli przy użyciu argumentu --prefix .

for row in $containerList
do
    tmpName=$(echo $row | sed -e 's/\r//g')
    az storage container delete \
    --name $tmpName 
done

Obsługa błędów

Aby zakończyć działanie skryptu natychmiast, jeśli polecenie zwróci stan niezerowy, uruchom następujące polecenie:

set -e

Aby uzyskać więcej informacji na temat ustawiania opcji powłoki i innych pomocy, uruchom następujące polecenia:

help set
help help

Czyszczenie zasobów

Po zakończeniu tego artykułu usuń grupę zasobów i wszystkie zasoby w nim. Użyj argumentu --no-wait .

if [ $(az group exists --name $resourceGroup) = true ]; then 
   az group delete --name $resourceGroup -y  --no-wait
else
   echo The $resourceGroup resource group does not exist
fi

Zobacz też