

**このドキュメントはバージョン 1 の AWS CLI のみを対象としています。**

AWS CLI バージョン 1 のサポート終了を発表しました。AWS CLI バージョン 2 に移行することをお勧めします。日付、その他の詳細、移行方法については、「[お知らせ](https://aws.amazon.com/blogs/developer/cli-v1-maintenance-mode-announcement/)」を参照してください。AWS CLI のバージョン 2 に関連するドキュメントについては、[バージョン 2 用ユーザーガイド](https://docs.aws.amazon.com/cli/latest/userguide/)を参照してください。

# Using quotation marks and literals with strings in the AWS CLI
<a name="cli-usage-parameters-quoting-strings"></a>

AWS CLI では、主に、一重引用符と二重引用符の使用方法が 2 つあります。
+ [空白を含む文字列を引用符で囲む](#cli-usage-parameters-quoting-strings-around)
+ [文字列内での引用符の使用](#cli-usage-parameters-quoting-strings-containing)

## 空白を含む文字列を引用符で囲む
<a name="cli-usage-parameters-quoting-strings-around"></a>

コマンドラインでパラメータ名とその値はスペースで区切ります。文字列値にスペースが埋め込まれている場合は、文字列全体を引用符で囲むことで、AWS CLI によってスペースが値と次のパラメータ名との区切りとして誤って解釈されないようにする必要があります。使用する引用符のタイプは、AWS CLI を実行しているオペレーティングシステムによって異なります。

------
#### [ Linux and macOS ]

一重引用符 `' '` を使用します。

```
$ aws ec2 create-key-pair --key-name 'my key pair'
```

引用符の使用方法の詳細については、使用するシェルのユーザードキュメントを参照してください。

------
#### [ PowerShell ]

**一重引用符 (推奨)**

一重引用符 `' '` は `verbatim` 文字列と呼ばれます。文字列は、入力したとおりにコマンドに渡されるため、PowerShell 変数は通過しません。

```
PS C:\> aws ec2 create-key-pair --key-name 'my key pair'
```

**二重引用符**

二重引用符 `" "` は `expandable` 文字列と呼ばれます。変数は拡張可能な文字列で渡すことができます。

```
PS C:\> aws ec2 create-key-pair --key-name "my key pair"
```

引用符の使用方法の詳細については、*Microsoft PowerShell ドキュメント*の「[About Quoting Rules](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_quoting_rules?view=powershell-7)」を参照してください。

------
#### [ Windows command prompt ]

二重引用符 `" "` を使用します。

```
C:\> aws ec2 create-key-pair --key-name "my key pair"
```

------

オプションとして、パラメータ名と値をスペースの代わりに等号 `=` で区切ることができます。通常、これはパラメータの値がハイフンで始まる場合にのみ必要です。

```
$ aws ec2 delete-key-pair --key-name=-mykey
```

## 文字列内での引用符の使用
<a name="cli-usage-parameters-quoting-strings-containing"></a>

文字列に引用符が含まれている場合があり、シェルが正しく動作するためには、引用符のエスケープが必要になることがあります。パラメータ値の一般的なタイプの 1 つとして JSON 文字列があります。JSON 構造内の各要素の名前と値の前後にスペースと二重引用符 `" "` が含まれているため、これは複雑です。コマンドラインで JSON 形式のパラメータを入力する方法はオペレーティングシステムによって異なります。

コマンドラインでより高度な JSON を使用するには、`jq` のようなコマンドライン JSON プロセッサを使用して JSON 文字列を作成することを検討してください。`jq` の詳細については、*GitHub* の [jq repository](http://stedolan.github.io/jq/) を参照してください。

------
#### [ Linux and macOS ]

Linux および macOS で文字列を文字どおりに解釈するには、次の例のように、一重引用符 `' '` を使用して JSON データ構造を囲みます。JSON 文字列に埋め込まれた二重引用符は、文字どおり処理されるため、エスケープする必要はありません。JSON は一重引用符で囲まれているため、文字列内の一重引用符はエスケープする必要があります。このためには、通常は一重引用符 `\'` の前にバックスラッシュを使用します。

```
$ aws ec2 run-instances \
    --image-id ami-12345678 \
    --block-device-mappings '[{"DeviceName":"/dev/sdb","Ebs":{"VolumeSize":20,"DeleteOnTermination":false,"VolumeType":"standard"}}]'
```

引用符の使用方法の詳細については、使用するシェルのユーザードキュメントを参照してください。

------
#### [ PowerShell ]

一重引用符 `' '` または二重引用符 `" "` を使用します。

**一重引用符 (推奨)**

一重引用符 `' '` は `verbatim` 文字列と呼ばれます。文字列は、入力したとおりにコマンドに渡されるため、PowerShell 変数は通過しません。

JSON データ構造には二重引用符が含まれているため、**一重**引用符 `' '` で囲むことをお勧めします。**一重**引用符を使用する場合は、JSON 文字列に埋め込まれた**二重**引用符をエスケープする必要はありません。ただし、JSON 構造内では、各**一重**引用符をバックティック ``` でエスケープする必要があります。

```
PS C:\> aws ec2 run-instances `
    --image-id ami-12345678 `
    --block-device-mappings '[{"DeviceName":"/dev/sdb","Ebs":{"VolumeSize":20,"DeleteOnTermination":false,"VolumeType":"standard"}}]'
```

**二重引用符**

二重引用符 `" "` は `expandable` 文字列と呼ばれます。変数は拡張可能な文字列で渡すことができます。

**二重**引用符を使用する場合は、JSON 文字列に埋め込まれた **一重**引用符をエスケープする必要はありません。ただし、次の例のように、JSON 構造内で各**二重**引用符をバックティック ``` でエスケープする必要があります。

```
PS C:\> aws ec2 run-instances `
    --image-id ami-12345678 `
    --block-device-mappings "[{`"DeviceName`":`"/dev/sdb`",`"Ebs`":{`"VolumeSize`":20,`"DeleteOnTermination`":false,`"VolumeType`":`"standard`"}}]"
```

引用符の使用方法の詳細については、*Microsoft PowerShell ドキュメント*の「[About Quoting Rules](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_quoting_rules?view=powershell-7)」を参照してください。

**警告**  
PowerShell は AWS CLI にコマンドを送信する前に、コマンドが一般的な PowerShell と `CommandLineToArgvW` 引用ルールのどちらを使用して解釈されるかを判断します。PowerShell が `CommandLineToArgvW` を使用して処理する場合は、バックスラッシュ `\` で文字をエスケープする必要があります。  
PowerShell の`CommandLineToArgvW` 詳細については、[ マイクロソフトドキュメントブログの](https://devblogs.microsoft.com/oldnewthing/20100917-00/?p=12833)「*Microsoft DevBlogs* [の CommandLineToArgvW による引用符とバックスラッシュの奇妙な扱いの理由](https://docs.microsoft.com/en-us/archive/blogs/twistylittlepassagesallalike/everyone-quotes-command-line-arguments-the-wrong-way)」を参照してください。*コマンドライン引数を間違った方法で引用する人々*、[ および Microsoft Docs ](https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-commandlinetoargvw#remarks)の *CommandLineToArgvW 関数を参照してください * 。  
**一重引用符**  
一重引用符 `' '` は `verbatim` 文字列と呼ばれます。文字列は、入力したとおりにコマンドに渡されるため、PowerShell 変数は通過しません。バックスラッシュ `\` で文字をエスケープします。  

```
PS C:\> aws ec2 run-instances `
    --image-id ami-12345678 `
    --block-device-mappings '[{\"DeviceName\":\"/dev/sdb\",\"Ebs\":{\"VolumeSize\":20,\"DeleteOnTermination\":false,\"VolumeType\":\"standard\"}}]'
```
**二重引用符**  
二重引用符 `" "` は `expandable` 文字列と呼ばれます。変数は `expandable` 文字列で渡すことができます。二重引用符で囲まれた文字列の場合、バックティックだけを使用するのではなく、引用符ごとに *`\$1* を使用して 2 回エスケープする必要があります。バックティックはバックスラッシュをエスケープし、バックスラッシュは `CommandLineToArgvW` プロセスのエスケープ文字として使用されます。  

```
PS C:\> aws ec2 run-instances `
    --image-id ami-12345678 `
    --block-device-mappings "[{`\"DeviceName`\":`\"/dev/sdb`\",`\"Ebs`\":{`\"VolumeSize`\":20,`\"DeleteOnTermination`\":false,`\"VolumeType`\":`\"standard`\"}}]"
```
**Blobs (推奨)**  
JSON データ入力の PowerShell 引用ルールをバイパスするには、BLOB を使用して JSON データを AWS CLI に直接渡します。BLOB の詳細については、「[blob](cli-usage-parameters-types.md#parameter-type-blob)」を参照してください。

------
#### [ Windows command prompt ]

Windows コマンドプロンプトでは、JSON データ構造を二重引用符 `" "` で囲む必要があります。また、コマンドプロセッサによって、JSON に埋め込まれた二重引用符が誤って解釈されないようにするには、以下の例のように、JSON データ構造内の各二重引用符 `\` をエスケープする (バックスラッシュ `"` 文字で始める) 必要もあります。

```
C:\> aws ec2 run-instances ^
    --image-id ami-12345678 ^
    --block-device-mappings "[{\"DeviceName\":\"/dev/sdb\",\"Ebs\":{\"VolumeSize\":20,\"DeleteOnTermination\":false,\"VolumeType\":\"standard\"}}]"
```

最も外側の二重引用符のみエスケープしません。

------