Bash: 寻找匹配项时出现意外的 EOF

Bash: unexpected EOF while looking for matching

我正在尝试 运行 远程 AWS Windows Server 2016 数据中心上的 BitBucket 管道。

image: python:3.5.1

pipelines:
  custom: # Pipeline that only runs manually
    default:
      - step:
          caches:
            - pip
          script: # Modify the commands below to build your repository.
            - pip install awscli
            - <- 
              aws ssm send-command 
              --document-name "AWS-RunRemoteScript" 
              --instance-ids "i-000000000000000" 
              --parameters '{\"sourceType\":[\"S3\"],\"sourceInfo\":[\'{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}\'],\"executionTimeout\":[\"3600\"],\"commandLine\":[\"test.ps1\"],\"workingDirectory\":[\"C:\\TOM\"]}' 
              --timeout-seconds 600 
              --region us-east-2

当我尝试 运行 连接管道时,出现以下错误:

+ <- aws ssm send-command --document-name "AWS-RunRemoteScript" --instance-ids "i-000000000000000" --parameters '{\"sourceType\":[\"S3\"],\"sourceInfo\":[\'{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}\'],\"executionTimeout\":[\"3600\"],\"commandLine\":[\"test.ps1\"],\"workingDirectory\":[\"C:\\TOM\"]}' --timeout-seconds 600 --region us-east-2
bash: /opt/atlassian/pipelines/agent/tmp/bashScript5876925824407417765.sh: line 8: unexpected EOF while looking for matching `''

我已经研究了语法 2-3 次,但不确定到底是什么问题。我在命令中没有看到任何额外的单引号。非常感谢任何帮助。

更新 1:

@rici:

+ aws ssm send-command  --document-name "AWS-RunRemoteScript"  --instance-ids "i-0000000000000000"  --parameters '{"sourceType":["S3"],"sourceInfo":['\''{"path":"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1"}'\''],"executionTimeout":["3600"],"commandLine":["test.ps1"],"workingDirectory":["C:\TOM"]}'

Error parsing parameter '--parameters': Invalid JSON: Expecting value: line 1 column 36 (char 35)
JSON received: {"sourceType":["S3"],"sourceInfo":['{"path":"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1"}'],"executionTimeout":["3600"],"commandLine":["test.ps1"],"workingDirectory":["C:\TOM"]}

更新 2:

+ aws ssm send-command --document-name "AWS-RunRemoteScript" --instance-ids "i-0000000000000000" --parameters '{\"sourceType\":[\"S3\"],\"sourceInfo\":["{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}"],\"executionTimeout\":[\"3600\"],\"commandLine\":[\"test.ps1\"],\"workingDirectory\":[\"C:\\TOM\"]}' --timeout-seconds 600 --region us-east-2
Error parsing parameter '--parameters': Invalid JSON: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
JSON received: {\"sourceType\":[\"S3\"],\"sourceInfo\":["{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}"],\"executionTimeout\":[\"3600\"],\"commandLine\":[\"test.ps1\"],\"workingDirectory\":[\"C:\\TOM\"]}

在 shell 中,单引号字符串中的反斜杠不会转义任何内容。他们只是普通的角色。此外,您可以通过将多个带引号或不带引号的字符串段写在一起来连接它们,只要空格被引号。

所以如果你有:

'abc\'def\'ghi'

你得到:

  • 由四个字符组成的单引号段 abc\。第二个 ' 终止这个引用段。
  • 未加引号的字符 def
  • 反斜杠转义的 '(因为反斜杠会转义单引号段之外的引号)
  • 未加引号的字符ghi
  • 最后,一个不匹配的 ',导致了错误消息。

由于反斜杠是单引号字符串中的普通字符,您可能也不希望双引号前有反斜杠。所以有可能你的目标是:

--parameters '{"sourceType":["S3"],"sourceInfo":['\''{"path":"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1"}'\''],"executionTimeout":["3600"],"commandLine":["test.ps1"],"workingDirectory":["C:\\TOM"]}'

注意使用序列'\''到:

  • 关闭单引号段
  • 插入单引号
  • 打开一个新的单引号段

由于不可能在单引号字符串中放置单引号,所以这个习语很常见,尽管它通常写成 '"'"'.

但是,我并不完全相信您真的应该单引号 sourceInfo 参数。如果那应该是 JSON,单引号无效,因此 sourceInfo 参数的值需要用双引号引起来,并且需要转义该字符串值中的双引号:

--parameters '{"sourceType":["S3"],"sourceInfo":["{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}"],"executionTimeout":["3600"],"commandLine":["test.ps1"],"workingDirectory":["C:\\TOM"]}'