Dowiedz się, jak używać powłoki Bash za pomocą interfejsu wiersza polecenia platformy Azure

Polecenia referencyjne interfejsu wiersza polecenia platformy Azure mogą być wykonywane w kilku różnych środowiskach powłoki, ale 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ł będzie doskonałym miejscem na rozpoczęcie nauki. Zapoznaj się z tym artykułem, podobnie jak w przypadku samouczka, a wkrótce będziesz z łatwością korzystać z interfejsu wiersza polecenia platformy Azure w środowisku powłoki Bash.

Z tego artykułu dowiesz się, jak wykonać następujące czynności:

  • Wyniki zapytania jako słowniki lub tablice JSON
  • Formatuj dane wyjściowe w formacie JSON, tabeli lub TSV
  • Zapytania, filtrowanie i formatowanie pojedynczych i wielu wartości
  • Użyj składni if/exists/then i case
  • Używanie dla 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 używasz powłoki Bash przy użyciu usługi Azure Cloud Shell lub lokalnego interfejsu wiersza polecenia platformy Azure w kontenerze platformy Docker.

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

Polecenie, które zawsze zwraca tylko jeden 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 informacje identyfikacyjne zostały 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 , formacie 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 zagnieżdżonych wartości

Następujące zapytania przedstawiają wykonywanie zapytań dotyczących pojedynczych wartości, w tym zagnieżdżonych wartości 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. Jest to przydatne w przypadku usuwania znaków cudzysłowu w zwróconej wartości — co jest przydatne do korzystania z danych wyjściowych w innych poleceniach i narzędziach, które muszą przetworzyć tekst w jakiejś formie (jak pokażemy 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 wielu wartości, w tym zagnieżdżonych wartości

Aby uzyskać więcej niż jedną właściwość, umieść wyrażenia w nawiasach kwadratowych [ ] (lista wielokrotnego wyboru) jako listę rozdzielaną przecinkami. Następujące 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

W poniższych zapytaniach pokazano użycie operatora { } (skrótu wielokrotnego wyboru) 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 nazwy 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 false, 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 bazują na tym, czego dowiedzieliśmy się wcześniej, aby filtrować i formatować wyniki. Na koniec końcowe 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 randomizacji

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

Ustawienie i użycie wartości losowej 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 ponieważ usunięty obiekt 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ą (od 0 do 32767). Polecenie let jest wbudowanym poleceniem powłoki Bash umożliwiającym ocenę wyrażeń arytmetycznych. Za pomocą następującego polecenia tworzy wystarczająco unikatową wartość dla większości celów.

let "randomIdentifier=$RANDOM*$RANDOM"

Praca z spacjami i znakami cudzysłowu

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, których biały znak jest znakiem specjalnym. Gdy powłoka 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 celu użyj cudzysłowów podwójnych.

Poniższe polecenia używają polecenia az group create , aby zilustrować użycie pojedynczych i podwójnych cudzysłowów 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 właśnie 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 funkcji != i , aby ocenić liczby przy użyciu funkcji -ne. Poniższa instrukcja If Then Else ocenia, czy zmienna $resourceGroup została ustawiona. 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 To 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 istnieje już jedna z określoną nazwą. 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. Na końcu tego artykułu przedstawimy użycie 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

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 przesyła potoki danych wyjściowych 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 dla pętli i wykonywania zapytań dotyczących tablic

W tej sekcji artykułu utworzymy konto magazynu, a następnie użyjemy pętli do utworzenia wielu obiektów blob i kontenerów. Pokażemy 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, które będzie 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 kluczy 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

Definiowanie zmiennych środowiskowych przy użyciu funkcji EXPORT

W poprzednich skryptach kontenera magazynu określiliśmy nazwę konta i klucz konta przy użyciu każdego polecenia. Zamiast tego można przechowywać poświadczenia uwierzytelniania przy użyciu odpowiednich zmiennych środowiskowych: AZURE_STORAGE_ACCOUNT i AZURE_STORAGE_KEY. W tym celu 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

Poniższe 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 natychmiast zamknąć skrypt, jeśli polecenie zwróci stan inny niż zero, uruchom następujące polecenie:

set -e

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

help set
help help

Czyszczenie zasobów

Po zakończeniu pracy z tym artykułem 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ż