Bash を Azure CLI で使用する方法について説明します

Azure CLI のリファレンス コマンドは、いくつかの異なるシェル環境で実行できますが、Microsoft Docs では主に Bash 環境を使用します。 Bash と Azure CLI を初めて使用する場合は、この記事は学習の開始に最適です。 チュートリアルと同様にこの記事に取り組むと、すぐに簡単に Bash 環境で Azure CLI を使用できるようになります。

この記事では、次を行う方法を説明します。

  • JSON ディクショナリまたは配列としての結果の照会
  • JSON、テーブル、TSV としての出力の書式設定
  • 1 つの値と複数の値のクエリ、フィルター処理、書式設定
  • if/exists/then と case 構文の使用
  • for ループの使用
  • grep、sed、paste、bc コマンドの使用
  • シェルと環境変数の設定と使用

Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。

Bash の開始

Azure Cloud Shell または Azure CLI のローカル インストールを使用して Bash を開始します。 この記事では、Azure Cloud Shell を使用するか、Docker コンテナーで Azure CLI をローカル実行して Bash を実行していることを前提とします。

ディクショナリ結果の照会

常に 1 つのオブジェクトのみを返すコマンドは、JSON ディクショナリを返します。 ディクショナリは、キーを使用してアクセスされる、順序指定されていないオブジェクトです。 この記事では、まず Account Show コマンドを使用して、Account オブジェクトに対してクエリを実行することから始めます。

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

次の JSON ディクショナリ出力では、簡潔にするために一部のフィールドが省略されています。また、識別情報が削除されるか、一般化されています。

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

YAML としての出力の書式設定

--output yaml 引数 (または -o yaml) を使用して、プレーンテキスト データ シリアル化形式である、yaml 形式で出力を書式設定します。 YAML は JSON より読みやすくなる傾向があり、その形式に簡単にマップされます。 一部のアプリケーションおよび CLI コマンドは、構成の入力として、JSON ではなく YAML を受け取ります。

az account show --output yaml

出力を yaml として書式設定する方法の詳細については、「YAML 出力形式」を参照してください。

テーブルとしての出力の書式設定

--output table 引数 (または -o table) を使用して、出力を ASCII テーブルとして書式設定します。 入れ子になったオブジェクトはテーブル出力には含まれませんが、クエリの一部としてフィルター処理することもできます。

az account show --output table

出力をテーブルとして書式設定する方法の詳細については、「テーブル出力形式」を参照してください。

単一値と入れ子になった値のクエリと書式設定

次のクエリは、JSON ディクショナリの出力に入れ子になった値を含む、単一値を照会する方法を示しています。 このセットの最後のクエリでは、-o tsv 引数を使用して出力を書式設定する方法が示されています。 この引数は、結果をタブ区切り値と改行区切り値として返します。 これは、返される値の引用符を削除する場合に便利です。たとえば、テキストを何らかの形式で処理する必要がある他のコマンドやツールでその出力を使用する場合に便利です (これについては、この記事の後半で説明します)。

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

入れ子になった値を含む複数の値のクエリと書式設定

複数のプロパティを取得するには、式をコンマ区切りリストとして角かっこ [ ] (複数選択リスト) で囲みます。 次のクエリは、複数の出力形式を使用して、JSON ディクショナリの出力で複数の値を照会する方法を示しています。

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

複数の値を返す方法の詳細については、「複数の値を取得する」を参照してください。

クエリでのプロパティの名前変更

次のクエリは、複数の値を照会するときに、{ } (複数選択ハッシュ) 演算子を使用して配列の代わりにディクショナリを取得する方法を示しています。 また、クエリ結果でプロパティの名前を変更する方法も示されています。

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

クエリ内のプロパティの名前変更の詳細については、「クエリでプロパティの名前を変更する」を参照してください。

ブール値のクエリ

ブール値は true と見なされるため、az account list コマンドの "[?isDefault]" クエリ構文は現在の既定のサブスクリプションを返します。 false 値を取得するには、\ のようなエスケープ文字を使用する必要があります。

次のクエリは、サブスクリプション内のすべてのアカウントに対してクエリを実行し、特定のアカウントに複数のサブスクリプションがある場合に JSON 配列を返し、既定のサブスクリプションであるアカウントに対してクエリを実行する方法を示しています。 また、既定のサブスクリプションではないアカウントに対してクエリを実行する方法も示します。 これらのクエリは、結果をフィルター処理して書式設定する方法について以前に学習した内容に基づいて作成されます。 最後のクエリでは、クエリ結果を変数に格納する方法が示されます。

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

変数とランダム化を使用したオブジェクトの作成

後続のコマンドで使用するランダムな値の設定

変数で使用するためにランダムな値を設定し、それを活用すると、名前が競合することなく、スクリプトを複数回実行できます。 名前付けの競合は、サービス全体で値が一意である必要がある場合や、削除プロセスが完了するまで削除したオブジェクトが Azure 内に存在する場合に生じることがあります。

$RANDOM は、ランダム符号付き 16 ビット整数 (0 から 32767) を返す bash 関数 (定数ではない) です。 この let コマンドは、算術式を評価するための組み込みの Bash コマンドです。 次のコマンドを使用すると、ほとんどの目的で、一意の値を作成できます。

let "randomIdentifier=$RANDOM*$RANDOM"

スペースと引用符の使用

スペースは、コマンド、オプション、引数を分けるために使用されます。 引用符を使用して、すべての特殊文字を無視するように Bash シェルに指示します (空白も特殊文字に含まれます)。 Bash シェルは、最初の引用符を確認すると、終了引用符まで特殊文字を無視します。 ただし、Bash シェルで、ドル記号、バック クォート、バックスラッシュなどの特定の特殊文字を解析する必要がある場合があります。 その場合、二重引用符を使用します。

次のコマンドでは、変数を操作してオブジェクトを作成するときに、スペースを処理し、特殊文字を評価するための単一引用符と二重引用符の使用を示すため、az group create コマンドが使用されています。

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 

JSON ディクショナリの出力で、作成したばかりのリソース グループのプロパティを確認します。

If Then Else を使用して変数が null かどうかを判断する

文字列を評価するには != を使用し、数値を評価するには -ne を使用します。 次の If Then Else ステートメントは、$resourceGroup 変数が設定されているかどうかを評価します。 yes の場合、変数の値を返します。 no の場合、変数を設定します。

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

If Then を使用してリソース グループを作成または削除する

次のスクリプトは、指定した名前のリソース グループがまだ存在しない場合にのみ、新しいリソース グループを作成します。

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

次のスクリプトは、指定した名前のリソース グループが存在する場合にのみ、既存の新しいリソース グループを削除します。 --no-wait 引数を使用すると、コマンドの完了を待たずにコントロールを返すこともできます。 しかし、この記事では、リソース グループが削除されるのを待ってから続行します。 非同期操作の詳細については、「非同期操作」を参照してください。 この記事の最後で --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

Grep を使用してリソース グループが存在するかどうかを判断し、存在しない場合はリソース グループを作成する

次のコマンドは、az group list コマンドの出力を grep コマンドにパイプ処理します。 指定したリソース グループが存在しない場合、前に定義した変数を使用してリソース グループを作成します。

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

CASE ステートメントを使用してリソース グループが存在するかどうかを判断し、存在しない場合はリソース グループを作成する

次の CASE ステートメントは、指定した名前のリソース グループがまだ存在しない場合にのみ、新しいリソース グループを作成します。 指定した名前のリソース グループが存在する場合、CASE ステートメントはリソース グループが存在することをそのまま伝えます。

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

for ループの使用と配列のクエリ

記事のこのセクションでは、ストレージ アカウントを作成し、for ループを使用して多数の BLOB とコンテナーを作成します。 また、JSON 配列のクエリと環境変数の操作についても説明します。

ストレージ アカウントの作成

次のコマンドでは、az storage account create コマンドを使用して、ストレージ コンテナーの作成時に使用するストレージ アカウントを作成します。

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

ストレージ アカウント キーの取得

次のコマンドでは、az storage account keys list コマンドを使用して、ストレージ アカウント キーの値を返します。 次に、ストレージ コンテナーの作成時に使用する変数にキー値を格納します。

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

ストレージ コンテナーの作成

まず、az storage container create を使用して単一のストレージ コンテナーを作成し、az storage container list を使用して作成されたコンテナーの名前を照会します。

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

データのコンテナーへのアップロード

次のスクリプトでは、for ループを使用して 3 つのサンプル ファイルを作成します。

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

次のスクリプトでは、az storage blob upload-batch コマンドを使用して、BLOB をストレージ コンテナーにアップロードします。

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

次のスクリプトでは、az storage blob list コマンドを使用して、コンテナーの BLOB を一覧表示します。

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

次のスクリプトは、ストレージ コンテナーの合計バイト数を表示します。

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

ループを使用した複数のコンテナー作成

次に、ループを記述するいくつかの方法を示しながら、ループを使用して、複数のコンテナーを作成します。

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 を使用して環境変数を定義する

前述のストレージ コンテナー スクリプトでは、すべてのコマンドでアカウント名とアカウント キーを指定しました。 その代わりに、対応する環境変数 AZURE_STORAGE_ACCOUNTAZURE_STORAGE_KEY を使用して、認証資格情報を格納できます。 これを行うには、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.

次のスクリプトでは、メタデータ文字列を作成し、az storage container metadata update コマンドを使用して、その文字列でコンテナーを更新します。それから環境変数を再度使用します。

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

次のコマンドでは、az storage container delete コマンドを使用して 1 つの名前付きコンテナーを削除します。その後、ループで複数のコンテナーを削除します。

az storage container delete \
    --name $container

特定のプレフィックスを含むコンテナーの一覧を取得し、結果を変数に格納します。

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

--prefix 引数を使用し、ループでコンテナーの一覧を削除します。

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

エラー処理

コマンドが 0 以外の状態を返した場合にスクリプトを直ちに終了するには、次のコマンドを実行します。

set -e

シェル オプションの設定方法の詳細や、その他のヘルプ トピックについては、次のコマンドを実行します。

help set
help help

リソースをクリーンアップする

この記事が完了したら、リソース グループとその中のすべてのリソースを削除します。 --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

関連項目