如何使用 Docker bash 命令解析双引号字符串多行?

How to parse with Docker bash command a double quoted string multiline?

我的 Docker 撰写文件中有这样的内容:

command: >
      bash -c "
        ...some statements here...
        gcloud ...some params... --ddl=\
         \"CREATE TABLE ....; \
          CREATE UNIQUE INDEX...; \
          CREATE UNIQUE INDEX...; \
          CREATE TABLE ...; \
          CREATE TABLE ...; \
          CREATE TABLE ...;\"
      "

这里的问题似乎是反斜杠 \ 在字符串“...”中无法正常工作,您可以在其中看到一些(为了便于阅读而被截断的)DDL 语句。我该如何解决?我尝试将 \ 替换为 \\n\ 但 none 有效。

有一个网站说明了在 yaml https://yaml-multiline.info 中处理 multi-line 字符串的不同方法,但不幸的是,他们的示例中并未涵盖这种特殊情况。

您 运行 遇到的问题是在 bash 中,在双引号内,我们不需要转义回车符 returns。删除以 --ddl=\ 结尾的转义行并将下一个 double-quote 移到那里也是最简单的方法,以便引用的文本从该点开始。此外,我们需要使用 >- 去除 yaml multi-line 语法中的 line-endings。所以结果是:

command: >-
    bash -c "
      ...some statements here...
      gcloud ...some params... --ddl=\"
        CREATE TABLE ....;
        CREATE UNIQUE INDEX...;
        CREATE UNIQUE INDEX...;
        CREATE TABLE ...;
        CREATE TABLE ...;
        CREATE TABLE ...;\"
    "

使用 dasel 我们可以看到命令中的文本块的解释与 yaml 中的完全相同:

$ dasel -f test-2.yaml --format '{{ .command }}'
bash -c "
  ...some statements here...
  gcloud ...some params... --ddl=\
   \"CREATE TABLE ....;
    CREATE UNIQUE INDEX...;
    CREATE UNIQUE INDEX...;
    CREATE TABLE ...;
    CREATE TABLE ...;
    CREATE TABLE ...;\"
"

如果我们复制完整引用的 bash -c 块而不是使用 echo,我们可以看到 bash 将解释的命令:

$ echo "
  ...some statements here...
  gcloud ...some params... --ddl=\"
    CREATE TABLE ....;
    CREATE UNIQUE INDEX...;
    CREATE UNIQUE INDEX...;
    CREATE TABLE ...;
    CREATE TABLE ...;
    CREATE TABLE ...;\"
"

  ...some statements here...
  gcloud ...some params... --ddl="
    CREATE TABLE ....;
    CREATE UNIQUE INDEX...;
    CREATE UNIQUE INDEX...;
    CREATE TABLE ...;
    CREATE TABLE ...;
    CREATE TABLE ...;"

生成的是有效的 shell 语法。 double-quote 内的回车 returns 不需要转义,引用的 --ddl= 值将作为一组有效的 sql 语句发送。