Amazon CLI 中的引号及字符串 - Amazon Command Line Interface
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文档仅适用于 Amazon CLI 版本 1。有关 Amazon CLI 版本 2 的相关文档,请参阅版本 2 用户指南

Amazon CLI 中的引号及字符串

在 Amazon CLI 中使用单引号和双引号主要有两种方式。

在包含空格的字符串周围使用引号

参数名称及其值由命令行中的空格分隔。如果字符串值包含嵌入式空格,则必须用引号将整个字符串括起来,以防止 Amazon CLI 将空格误解为值与下一个参数名称之间的分隔符。您使用的引号类型取决于您运行 Amazon CLI 的操作系统。

Linux and macOS

使用单引号 ' '

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

有关使用引号的更多信息,请参阅首选 Shell 的用户文档。

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 文档 中的关于引号规则

Windows command prompt

使用双引号 " "

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

(可选)您可以用等号 = 而不是空格将参数名称和值分隔开。这通常仅在参数的值以连字符开头时有必要。

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

在字符串内使用引号

字符串可能包含引号,并且您的 Shell 可能需要对引号进行转义才能让其正常发挥作用。常见的参数值类型之一是 JSON 字符串。这很复杂,因为它在 JSON 结构中的每个元素名称和值周围都包含空格和双引号 " "。在命令行中输入 JSON 格式参数的方式因操作系统而异。

要在命令行中使用更高级的 JSON,请考虑使用 jq 等命令行 JSON 处理器来创建 JSON 字符串。有关 jq 的更多信息,请参阅 GitHub 上的 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"}}]'

有关使用引号的更多信息,请参阅首选 Shell 的用户文档。

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 文档 中的关于引号规则

警告

PowerShell 在向 Amazon CLI 发送命令之前,它会确定是使用典型 PowerShell 还是 CommandLineToArgvW 引用规则来解释您的命令。PowerShell 使用 CommandLineToArgvW 进行处理时,必须用反斜杠 \ 对字符进行转义。

有关 PowerShell 中 CommandLineToArgvW 的更多信息,请参阅 Microsoft DevBlogs 上的 What's up with the strange treatment of quotation marks and backslashes by CommandLineToArgvW(CommandLineToArgvW 对引号和反斜杠的奇怪处理是怎么回事)、Microsoft Docs Blog 中的 Everyone quotes command line arguments the wrong way(每个人引用命令行参数的方法都错了)以及 Microsoft Docs 上的 CommandLineToArgvW function(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 字符串中传递。对于双引号字符串,必须对每个引号使用 `\ 进行两次转义,而不是仅使用反引号。反引号对反斜杠进行转义,然后将反斜杠用作 CommandLineToArgvW 流程的转义字符。

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

Blob(推荐)

要绕过 JSON 数据输入的 PowerShell 引用规则,请使用 Blob 将 JSON 数据直接传递到 Amazon CLI。有关 Blob 的更多信息,请参阅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\"}}]"

只有最外层双引号不进行转义。