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"}"

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

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

自分の環境で文字列がどのように評価されるかがわからない場合は、コンソールに文字列の値を返すか、「Azure CLI リファレンス コマンドをデバッグする」で説明されているように --debug を使用します。

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

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

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

以下のスクリプト例は、以下に関する環境固有の構文のデモンストレーションを行います。

  • 行の連結
  • 変数の使用
  • ランダムな識別子
  • 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

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 パラメーターが用意されています。 デバッグ出力は広範囲に及びますが、実行エラーに関する詳細情報を提供します。 Bash clear コマンドを使用して、テスト間でコンソール出力を削除します。

以下の例は、Azure CLI が Python 構文で受け取る実際の引数を明らかにします。

この例は、Bash と PowerShell の両方で正しいです。

az '{"key":"value"}' --debug

出力の Command arguments 行で Azure CLI が解釈している内容を確認します。

Command arguments: ['{"key":"value"}', '--debug']

この 2 番目の例も正しいです。 Bash clear コマンドを使用して、テスト間でコンソール出力を削除します。

clear
az "{\"key\":\"value\"}" --debug
Command arguments: ['{"key":"value"}', '--debug']

以下の 2 つの例は、引用符とスペースが Bash によって解釈されるため、正しくありません

正しくない形式 問題 コンソール出力
az {"key":"value"} --debug 一重引用符またはエスケープ文字が足りていません Command arguments: ['{key:value}', '--debug']
az {"key": "value"} --debug 一重引用符またはエスケープ文字が足りておらず、余分なスペースが含まれています Command arguments: ['{key:', 'value}', '--debug']

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" が表示されるのは、行連結文字が不足しているときです。

さらなる詳細を取得する

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

サブジェクト 詳細情報
スクリプトの違い Bash の引用符
PowerShell の引用符
PowerShell での引用に関する問題
Windows コマンドラインのヒント
パラメーター Azure CLI パラメーターでの引用符の使用
JMESPath を使用したコマンド出力のクエリ実行」で Bash、PowerShell、Cmd の構文例をさらに確認する

次の手順

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