次の方法で共有


Bash、PowerShell、Cmd での Azure CLI 構文の違いについて学習する

Azure CLI コマンドは、 BashPowerShell、および Windows コマンド シェル (Cmd) スクリプト言語の両方で実行できます。 しかし、スクリプトには僅かな違いがあります。 このチュートリアルの手順では、最初の Azure Storage アカウントを作成し、3 つのスクリプト言語すべてにパラメーター値を書式設定する方法について説明します。

前提条件

  • 環境の準備の前提条件を満たしていること。
  • リソース グループ レベルの contributor 以上のアクセス許可でリソース グループにアクセスできること。

行継続文字に注意する

ほとんどの Azure CLI ドキュメントは、Azure Cloud Shell を使用して Bash で記述およびテストされています。 Azure CLI 構文をコピーするときに覚えておく必要がある最初の点の 1 つは、選択したスクリプト言語の行継続文字が交換可能でないことを確認することです。

スクリプト言語 行継続文字
Bash 円記号 (\)
PowerShell バッククォート (`)
Cmd キャレット (^)

ヒント

Azure CLI コード ブロックの右上隅にある [コピー] ボタンでは、バックスラッシュ (\) とバッククォート (`) を意図的に削除できます。 フォーマットされたコード ブロックをコピーしたい場合は、キーボードまたはマウスを使用して例を選択してコピーします。

変数を使用する際の構文の違いを理解する

変数を使用するための構文は、スクリプト言語によって若干異なります。 比較すると以下のようになります。

ユース ケース Bash PowerShell Cmd
変数の作成 variableName=varValue $variableName="varValue" set variableName=varValue
変数をパラメーター値として使用する variableName $variableName %variableName%
変数を --query パラメーター内で使用する '$variableName' '$variableName' '$variableName'

コンソール画面に変数情報を返す方法はいくつかありますが、echo はほとんどの状況で動作します。 比較すると以下のようになります。

  • Bash: echo $varResourceGroup
  • PowerShell: echo $varResourceGroup
  • Cmd: echo %varResourceGroup%

手順 3 の「スクリプト内で使用する変数を設定する」では、変数構文の詳細な例を確認します。

スクリプト言語間の相違点の引用について説明します

すべての Azure CLI パラメーターは文字列です。 ただし、各スクリプト言語には、単一引用符と二重引用符、スペース、およびパラメーター値を処理するための独自の規則があります。

文字列値 Azure CLI PowerShell Cmd
テキスト 'text' または "text" 'text' または "text" "text"
番号 \`50\` ``50`` `50`
Boolean \`true\` ``false`` 'true'
'2021-11-15' '2021-11-15' '2021-11-15'
JSON '{"key":"value"}' または "{"key":"value"}" '{"key": "value"}' または "{'"key'": '"value'"}" または "{"key"": ""value""}" "{"key":"value"}"

多くの Azure CLI パラメーターは、スペースで区切られた値のリストを受け取ります。 これは引用符に影響します。

  • 引用符で囲まれていないスペース区切りリスト --parameterName firstValue secondValue
  • 引用符で囲まれたスペース区切りリスト: --parameterName "firstValue" "secondValue"
  • スペースを含む値: --parameterName "value1a value1b" "value2a value2b" "value3"

スクリプト言語によって文字列がどのように評価されるかがわからない場合は、コンソールに文字列の値を返すか、Debug Azure CLI リファレンス コマンドで説明されているように--debugを使用します。

学習した内容を適用するためのストレージ アカウントを作成する

このチュートリアル手順の残りでは、Azure CLI コマンドでの引用符規則のデモンストレーションを行い、「Azure CLI 用の環境を準備する」で作成したリソース グループを使用します。 <msdocs-tutorial-rg-00000000> は自分のリソース グループの名前に置き換えてください。

このチュートリアルで使用する Azure ストレージ アカウントを作成します。 この例では、ストレージ アカウント名にランダム ID を割り当てますが、別の名前を使用したい場合は、「ストレージ アカウントの概要」でストレージ アカウント名の規則を確認してください。

重要

ストレージ アカウントを作成する前に、 Microsoft.Storage リソース プロバイダーをサブスクリプションに登録する必要があります。 リソースの種類の登録の詳細については、「リソース プロバイダーの登録を参照してください。

この次のスクリプト例では、次のスクリプト言語固有の構文を示します。

  • 行の連結
  • 変数の使用
  • ランダムな識別子
  • echo コマンド
# Variable block
let "randomIdentifier=$RANDOM*$RANDOM"
location="eastus"
resourceGroup="<msdocs-tutorial-rg-00000000>"
storageAccount="msdocssa$randomIdentifier"

# Create a storage account.
echo "Creating storage account $storageAccount in resource group $resourceGroup"
az storage account create --name $storageAccount \
                          --resource-group $resourceGroup \
                          --location $location \
                          --sku Standard_RAGRS \
                          --kind StorageV2 \
                          --output json

Note

"サブスクリプションが見つかりません" というエラーが表示されましたか? このエラーは、 Microsoft.Storage がアクティブなサブスクリプションに登録されていない場合に発生します。 リソース プロバイダーを登録するには、「 Azure リソース プロバイダーと種類を参照してください。

Azure CLI は、新しいストレージ アカウントの作成時に 100 行を超える JSON を出力として返します。 次の JSON 辞書出力では、簡潔にするために省略されているフィールドがあります。

{
"accessTier": "Hot",
"allowBlobPublicAccess": false,
"creationTime": "yyyy-mm-ddT19:14:26.962501+00:00",
"enableHttpsTrafficOnly": true,
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/ msdocs-tutorial-rg-00000000/providers/Microsoft.Storage/storageAccounts/msdocssa00000000",
"keyCreationTime": {
  "key1": "yyyy-mm-ddT19:14:27.103127+00:00",
  "key2": "yyyy-mm-ddT19:14:27.103127+00:00"
},
"kind": "StorageV2",
"location": "eastus",
"name": "msdocssa00000000",
"primaryEndpoints": {
  "blob": "https://msdocssa00000000.blob.core.windows.net/"
},
"primaryLocation": "eastus",
"provisioningState": "Succeeded",
"resourceGroup": "msdocs-tutorial-rg-00000000",
"sku": {
  "name": "Standard_RAGRS",
  "tier": "Standard"
},
"statusOfPrimary": "available",
"statusOfSecondary": "available",
"tags": {},
"type": "Microsoft.Storage/storageAccounts"
}

引用符の違いを練習するためのタグを作成する

az storage account update を使用して、ストレージ アカウントを識別するのに役立つタグを追加し、引用符の違いについて学習します。 これらのスクリプトの例では、次のスクリプト言語固有の構文を示します。

  • スペースを含む値
  • 引用符内の空白スペース
  • 特殊文字のエスケープ
  • 変数の使用

--tags パラメーターは、スペースで区切られたキーと値のペアのリストを受け取ります。 <msdocs-tutorial-rg-00000000> を自分のリソース グループの名前に、<msdocssa00000000> を自分の Azure ストレージ アカウントの名前に置き換えてください。

# Create new tags. This syntax works with or without quotes around each key-value pair.
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags Team=t1 Environment=e1

# Create new tags containing spaces. You must use quotes.
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags "Floor number=f1" "Cost center=cc1"

# Create a new tag with an empty value.
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags "Department="''""

# Create a new tag containing special characters resulting in "Path": "$G:\\myPath".
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags "Path=\$G:\myPath"

# Create a tag from a variable.
newTag="tag1=tag value with spaces"
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags "$newTag"

このチュートリアル手順の実行中に以前のタグを上書きしたくない場合は、--operation パラメーターを merge に設定して az tag update コマンドを使用します。

# Get the resource ID of your storage account.
saID=$(az resource show --resource-group <msdocs-tutorial-rg-00000000> \
                        --name <msdocssa00000000> \
                        --resource-type Microsoft.Storage/storageAccounts \
                        --query "id" \
                        --output tsv)

echo My storage account ID is $saID

# Append new tags.
az tag update --resource-id $saID \
              --operation merge \
              --tags <tagName>=<tagValue>

# Get a list of all tags.
az tag list --resource-id $saID

スクリプト言語固有のスクリプトをさらに比較する

以下のスクリプトの違いを詳しく見てみましょう。 以下の例では、次に関する引用符の違いのデモンストレーションを行います。

  • JSON 文字列をパラメーター値として渡す
  • --query パラメーターを使用して結果をフィルター処理する
    • 数値
    • ブール値
    • Dates

JSON 文字列を含むパラメーターの例。 このチュートリアルでは az rest を使用していないため、このスクリプトは今後の参考のためのものです。

az rest --method patch \
        --url https://management.azure.com/subscriptions/<mySubscriptionID>/resourceGroups/<myResourceGroup>/providers/Microsoft.HybridCompute/machines/<machineName>?api-version=yyyy-mm-dd-preview \
        --resource https://management.azure.com/ \
        --headers Content-Type=application/json \
        --body '{"properties": {"agentUpgrade": {"enableAutomaticUpgrade": false}}}'

数値のフィルター処理の例。 現在のサブスクリプションに VM がない限り、この例は今後の参考のためのものです。

az vm list --resource-group <myResourceGroup> \
           --query "[?storageProfile.osDisk.diskSizeGb >=\`50\`].{Name:name, admin:osProfile.adminUsername, DiskSize:storageProfile.osDisk.diskSizeGb}" \
           --output table

このチュートリアルで作成したストレージ アカウントを使用してブール値をフィルター処理する例。

az storage account list --resource-group <msdocs-tutorial-rg-00000000> \
    --query "[?allowBlobPublicAccess == \`true\`].id"

このチュートリアルで作成したストレージ アカウントを使用して日付をフィルター処理する例。

# include time
az storage account list --resource-group <msdocs-tutorial-rg-00000000> \
    --query "[?creationTime >='2021-11-15T19:14:27.103127+00:00'].{saName:name, saID: id, sku: sku.name}"

# exclude time
az storage account list --resource-group <msdocs-tutorial-rg-00000000> \
    --query "[?creationTime >='2021-11-15'].{saName:name, saID: id, sku: sku.name}"

# subtract days and use a variable
saDate=$(date +%F -d "-30days")
az storage account list --resource-group <msdocs-tutorial-rg-00000000> \
    --query "[?creationTime >='$saDate'].{saName:name, saID: id, sku: sku.name}"

Azure CLI リファレンス コマンドをデバッグする

--debug パラメーターを使用する

Azure CLI には、任意のコマンドで使用できる --debug パラメーターが用意されています。 デバッグ出力は広範ですが、次のような情報が提供されます。

  • スクリプト言語によって解釈されるコマンド引数 (パラメーター値)
  • ログ ファイルの場所
  • API 呼び出しの詳細
  • 実行エラー

Azure CLI コマンドを使用するときに、実行エラーを理解して修正するのが難しい場合は、azure CLI が実行している手順を確認 --debug

ストレージ アカウントを作成するときのデバッグ出力のごく一部を次に示します。

 cli.knack.cli: Command arguments: ['storage', 'account', 'create', '--name', 'msdocssa00000000', '--resource-group', 'msdocs-rg-test', '--location', 'eastus', '--sku', 'Standard_RAGRS', '--kind', 'StorageV2', '--output', 'json', '--debug']
 ...
 cli.azure.cli.core.sdk.policies: Request URL: 'https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/checkNameAvailability?api-version=2023-01-01'
cli.azure.cli.core.sdk.policies: Request method: 'POST'
cli.azure.cli.core.sdk.policies: Request headers:
cli.azure.cli.core.sdk.policies:     'Content-Type': 'application/json'
cli.azure.cli.core.sdk.policies:     'Content-Length': '73'
cli.azure.cli.core.sdk.policies:     'Accept': 'application/json'
cli.azure.cli.core.sdk.policies:     'x-ms-client-request-id': '00000000-0000-0000-0000-000000000000'
cli.azure.cli.core.sdk.policies:     'CommandName': 'storage account create'
cli.azure.cli.core.sdk.policies:     'ParameterSetName': '--name --resource-group --location --sku --kind --output --debug'
cli.azure.cli.core.sdk.policies:     'User-Agent': 'AZURECLI/2.61.0 (DEB) azsdk-python-core/1.28.0 Python/3.11.8 (Linux-5.15.153.1-microsoft-standard-WSL2-x86_64-with-glibc2.35)'
cli.azure.cli.core.sdk.policies:     'Authorization': '*****'
cli.azure.cli.core.sdk.policies: Request body:
cli.azure.cli.core.sdk.policies: {"name": "msdocssa00000000", "type": "Microsoft.Storage/storageAccounts"}
urllib3.connectionpool: Starting new HTTPS connection (1): management.azure.com:443
urllib3.connectionpool: https://management.azure.com:443 "POST /subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/checkNameAvailability?api-version=2023-01-01 HTTP/1.1" 200 22
cli.azure.cli.core.sdk.policies: Response status: 200
...

トラブルシューティングに関するその他のヒントについては、「 Azure CLI のトラブルシューティングを参照してください。

echo コマンドを使用する

--debug は、Azure CLI が解釈している内容を正確に表示しますが、2 つ目の選択肢として式の値をコンソールに返す方法があります。 このメソッドは、「スクリプト内で使用する変数を設定する」で詳しく説明されている --query の結果を確認するときに役立ちます。

strExpression='{"key":"value"}'
echo $strExpression
{"key":"value"}

トラブルシューティング

Azure CLI リファレンス コマンド構文が正しく記述されていない場合の一般的なエラーを以下に示します。

  • "Bad request ...{something} is invalid" は、スペース、一重または二重引用符、引用符の不足によって引き起こされる可能性があります。

  • "Unexpected token..." は、余分なスペースまたは引用符が存在する場合に表示されます。

  • "Invalid jmespath_type value" エラーは、多くの場合、--query パラメーター内の正しくない引用符によって発生します。

  • "Variable reference is not valid" が表示されるのは、文字列が適切にフォーマットされていないときで、多くの場合、連結やエスケープ文字の不足が原因です。

  • "Unrecognized arguments" は、多くの場合、正しくない行連結文字によって引き起こされます。

  • "Missing expression after unary operator" が表示されるのは、行連結文字が不足しているときです。

その他のトラブルシューティングのヒントについては、「 Azure CLI コマンドのトラブルシューティングを参照してください。

さらなる詳細を取得する

このチュートリアル手順で説明したテーマのいずれかについてさらなる詳細が必要ですか? 次の表のリンクを使用してさらに学習してください。

サブジェクト 詳細情報
スクリプトの違い スクリプト言語間の相違点の引用
Bash クォートルール
PowerShell の引用規則
PowerShell スクリプト言語での Azure CLI の実行に関する考慮事項
Windows コマンドラインのヒント
パラメーター Azure CLI パラメーターでの引用符の使用
JMESPath を使用したコマンド出力のクエリ実行」で Bash、PowerShell、Cmd の構文例をさらに確認する
トラブルシューティング Azure CLI コマンドのトラブルシューティング

次の手順

Bash、PowerShell、Cmd 用の Azure CLI 構文を記述する方法の学習が完了したので、次の手順に進み、変数に値を抽出する方法を学習してください。