De Azure CLI gebruiken in een Bash-omgeving

Azure CLI-referentieopdrachten kunnen worden uitgevoerd in verschillende shell-omgevingen, maar Microsoft Docs gebruikt voornamelijk de Bash-omgeving. Als u geen ervaring hebt met Bash en ook de Azure CLI, is dit artikel een uitstekende plek om uw leertraject te beginnen. Lees dit artikel op dezelfde wijze als in een zelfstudie voor meer informatie over het gebruik van de Azure CLI in een Bash-omgeving.

In dit artikel leert u het volgende:

  • Queryresultaten als JSON-woordenlijsten of matrices
  • Uitvoer opmaken als JSON, tabel of TSV
  • Eén en meerdere waarden opvragen, filteren en opmaken
  • Gebruik als/bestaat/en de syntaxis van hoofdletters en kleine letters
  • Gebruiken voor lussen
  • Grep-, sed-, plak- en bc-opdrachten gebruiken
  • Shell- en omgevingsvariabelen vullen en gebruiken

Als u geen Azure-abonnement hebt, maakt u een gratis Azure-account voordat u begint.

Bash starten

Start Bash met behulp van Azure Cloud Shell of een lokale installatie van de Azure CLI. In dit artikel wordt ervan uitgegaan dat u Bash uitvoert met behulp van Azure Cloud Shell of azure CLI lokaal uitvoert in een Docker-container.

Query's uitvoeren op woordenlijstresultaten

Een opdracht die altijd slechts één object retourneert, retourneert een JSON-woordenlijst. Woordenlijsten zijn niet-geordende objecten die worden geopend met sleutels. Voor dit artikel beginnen we met het uitvoeren van query's op het accountobject met behulp van de opdracht Account weergeven.

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

De volgende uitvoer van de JSON-woordenlijst bevat enkele velden die zijn weggelaten om kort te zijn en het identificeren van gegevens is verwijderd of generiek gemaakt.

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

De uitvoer opmaken als YAML

Gebruik het --output yaml argument (of -o yaml) om de uitvoer in yaml-indeling op te maken, een serialisatie-indeling voor gegevens zonder opmaak. YAML is doorgaans gemakkelijker te lezen dan JSON en kan eenvoudig worden omgezet in die indeling. Sommige toepassingen en CLI-opdrachten gebruiken YAML als configuratie-invoer, in plaats van JSON.

az account show --output yaml

Zie de YAML-uitvoerindeling voor meer informatie over het opmaken van de uitvoer als yaml.

De uitvoer opmaken als een tabel

Gebruik het --output table argument (of -o table) om de uitvoer op te maken als een ASCII-tabel. Tabeluitvoer bevat geen geneste objecten, maar hierop kan wel worden gefilterd met behulp van een query.

az account show --output table

Zie de tabeluitvoerindeling voor meer informatie over het opmaken van de uitvoer als een tabel.

Enkelvoudige waarden en geneste waarden opvragen en opmaken

De volgende query's laten zien hoe u query's uitvoert op één waarde, inclusief geneste waarden in de uitvoer van een JSON-woordenlijst. De laatste query in deze set demonstreert het opmaken van de uitvoer met behulp van het -o tsv argument. Dit argument retourneert de resultaten als door tabs en nieuwe regels gescheiden waarden. Deze actie is handig voor het verwijderen van aanhalingstekens in de geretourneerde waarde. Dit is handig om de uitvoer te gebruiken in andere opdrachten en hulpprogramma's die de tekst in een bepaalde vorm moeten verwerken (zoals verderop in dit artikel wordt weergegeven).

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

Eigenschappen van matrices opvragen en opmaken

In de volgende query ziet u hoe u eigenschappen ophaalt in een JSON-matrix. Abonnementseigenschappen ophalen, weergegeven als een tabel met abonnementen.

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

Deze query retourneert resultaten die vergelijkbaar zijn met:

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

Meerdere waarden opvragen en opmaken, inclusief geneste waarden

Als u meer dan één eigenschap wilt ophalen, plaatst u expressies tussen vierkante haken [ ] (een lijst met meerdere selecties) als een door komma's gescheiden lijst. De volgende query's laten zien hoe u query's uitvoert op meerdere waarden in de uitvoer van een JSON-woordenlijst, met behulp van meerdere uitvoerindelingen.

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

Zie Meerdere waarden ophalen voor meer informatie over het retourneren van meerdere waarden.

De naam van eigenschappen in een query wijzigen

In de volgende query's wordt het gebruik van de operator {} (multiselect hash) gedemonstreert om een woordenlijst op te halen in plaats van een matrix bij het uitvoeren van query's op meerdere waarden. Ook wordt de naam van eigenschappen in het queryresultaat gedemonstreert.

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

Zie Eigenschappen wijzigen in een query voor meer informatie over het wijzigen van de naam van eigenschappen in een query.

Booleaanse waarden opvragen

Booleaanse waarden worden verondersteld waar te zijn, dus de "[?isDefault]" querysyntaxis voor de az account list opdracht retourneert het huidige standaardabonnement. Als u de valse waarden wilt ophalen, moet u een escape-teken gebruiken, zoals \.

De volgende query's laten zien hoe u alle accounts in een abonnement opvraagt, mogelijk een JSON-matrix retourneert als er meerdere abonnementen voor een bepaald account zijn en vervolgens een query uitvoert op welk account het standaardabonnement is. Ook ziet u hoe u query's uitvoert voor de accounts die niet het standaardabonnement zijn. Deze query's zijn gebaseerd op wat u eerder hebt geleerd om de resultaten te filteren en op te maken. Ten slotte laat de uiteindelijke query zien hoe de queryresultaten in een variabele worden opgeslagen.

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

Objecten maken met behulp van variabelen en randomisatie

Een willekeurige waarde instellen voor gebruik in volgende opdrachten

Als u een willekeurige waarde instelt en gebruikt voor gebruik in variabelen, kunt u scripts meerdere keren uitvoeren zonder naamconflicten. Naamconflicten kunnen optreden omdat een waarde uniek moet zijn binnen de service of omdat een object dat u hebt verwijderd nog steeds bestaat in Azure totdat het verwijderingsproces is voltooid.

$RANDOM is een bash-functie (geen constante) die een willekeurig 16-bits geheel getal retourneert (van 0 tot en met 32767). De let opdracht is een ingebouwde Bash-opdracht om rekenkundige expressies te evalueren. Met de volgende opdracht maakt u een voldoende unieke waarde voor de meeste doeleinden.

let "randomIdentifier=$RANDOM*$RANDOM"

Werken met spaties en aanhalingstekens

Spaties worden gebruikt voor het scheiden van opdrachten, opties en argumenten. Gebruik aanhalingstekens om de Bash-shell te laten weten dat alle speciale tekens moeten worden genegeerd, waarvan een witruimte een speciaal teken is. Wanneer de Bash-shell het eerste aanhalingsteken ziet, worden speciale tekens genegeerd totdat het aanhalingsteken wordt gesloten. Soms wilt u echter dat de Bash-shell bepaalde speciale tekens parseert, zoals dollartekens, aanhalingstekens en backslashes. Gebruik voor dit scenario dubbele aanhalingstekens.

De volgende opdrachten gebruiken de opdracht az group create om het gebruik van enkele en dubbele aanhalingstekens te illustreren. Deze opdrachten worden gebruikt om spaties te verwerken en speciale tekens te evalueren bij het werken met variabelen en het maken van een object.

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 

Controleer in de uitvoer van de JSON-woordenlijst de eigenschappen van de resourcegroep die is gemaakt.

If Then Else gebruiken om te bepalen of de variabele null is

Als u tekenreeksen wilt evalueren, gebruikt != en evalueert u getallen.-ne De volgende If Then Else-instructie evalueert of de $resourceGroup variabele is ingesteld. Zo ja, dan wordt de waarde van de variabele geretourneerd. Als dat niet het gaat, wordt de variabele ingesteld.

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

Als u vervolgens een resourcegroep wilt maken of verwijderen

Met het volgende script wordt alleen een nieuwe resourcegroep gemaakt als er nog geen resourcegroep met de opgegeven naam bestaat.

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

Met het volgende script wordt een bestaande nieuwe resourcegroep verwijderd als er al een met de opgegeven naam bestaat. U kunt het argument gebruiken om het --no-wait besturingselement te retourneren zonder te wachten tot de opdracht is voltooid. Voor dit artikel willen we echter wachten totdat de resourcegroep is verwijderd voordat u doorgaat. Zie Asynchrone bewerkingen voor meer informatie over asynchrone bewerkingen. We demonstreren het gebruik van het --no-wait argument aan het einde van dit artikel.

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

Grep gebruiken om te bepalen of er een resourcegroep bestaat en de resourcegroep te maken als deze niet bestaat

Met de volgende opdracht wordt de uitvoer van de az group list opdracht naar de grep opdracht uitgevoerd. Als de opgegeven resourcegroep niet bestaat, maakt de opdracht de resourcegroep met behulp van de eerder gedefinieerde variabelen.

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

Case-instructie gebruiken om te bepalen of er een resourcegroep bestaat en de resourcegroep te maken als dit niet het geval is

Met de volgende CASE-instructie wordt alleen een nieuwe resourcegroep gemaakt als er nog geen resourcegroep met de opgegeven naam bestaat. Als er een met de opgegeven naam bestaat, echot de CASE-instructie dat de resourcegroep bestaat.

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

Gebruiken voor lussen en het uitvoeren van query's op matrices

In deze sectie van het artikel maken we een opslagaccount en gebruiken we vervolgens voor lussen om blobs en containers te maken. We demonstreren ook het uitvoeren van query's op JSON-matrices en het werken met omgevingsvariabelen.

Een opslagaccount maken

De volgende opdracht maakt gebruik van de opdracht az storage account create om een opslagaccount te maken dat we gebruiken bij het maken van opslagcontainers.

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

De opslagaccountsleutels ophalen

De volgende opdrachten gebruiken de opdracht az storage account keys list om waarden voor de sleutel van het opslagaccount te retourneren. Vervolgens slaan we een sleutelwaarde op in een variabele voor gebruik bij het maken van opslagcontainers.

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

Opslagcontainer maken

We gebruiken eerst de az storage container create om één opslagcontainer te maken en vervolgens de az storage container list te gebruiken om een query uit te voeren op de naam van de gemaakte container.

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

Gegevens uploaden naar container

Met het volgende script worden drie voorbeeldbestanden gemaakt met behulp van een for-lus.

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

In het volgende script wordt de opdracht az storage blob upload-batch gebruikt om de blobs te uploaden naar de opslagcontainer.

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

In het volgende script wordt de opdracht az storage blob list gebruikt om de blobs in de container weer te geven.

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

In het volgende script worden de totale bytes in de opslagcontainer weergegeven.

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

Veel containers maken met behulp van lussen

Vervolgens maken we meerdere containers met behulp van een lus die een aantal manieren demonstreert om de lus te schrijven.

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

EXPORT gebruiken om omgevingsvariabelen te definiëren

In de voorgaande opslagcontainerscripts hebben we de accountnaam en accountsleutel opgegeven met elke opdracht. In plaats daarvan kunt u uw verificatiereferenties opslaan met behulp van de bijbehorende omgevingsvariabelen: AZURE_STORAGE_ACCOUNT en AZURE_STORAGE_KEY. Gebruik EXPORTEREN om deze actie uit te voeren.

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

Met het volgende script maakt u een metagegevenstekenreeks en gebruikt u vervolgens de opdracht az storage container metadata update om een container met die tekenreeks bij te werken, opnieuw met behulp van de omgevingsvariabelen.

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

De volgende opdracht maakt gebruik van de opdracht az storage container delete om één benoemde container te verwijderen en vervolgens meerdere containers in een lus te verwijderen.

az storage container delete \
    --name $container

Haal een lijst op met containers met een specifiek voorvoegsel en sla resultaten op in een variabele.

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

Verwijder de lijst met containers in een lus met behulp van het --prefix argument.

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

Foutafhandeling

Als u een script onmiddellijk wilt afsluiten als een opdracht een niet-nulstatus retourneert, voert u de volgende opdracht uit:

set -e

Voer de volgende opdrachten uit voor meer informatie over het instellen van Shell-opties en andere Help-opdrachten:

help set
help help

Resources opschonen

Wanneer u klaar bent met dit artikel, verwijdert u de resourcegroep en alle resources erin. Gebruik het --no-wait argument.

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

Zie ook