如何使用 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 语句发送。
我的 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 语句发送。