定义变量时出错

定义变量时出错

我正在尝试跟随替换多行文本。

但要做到这一点,我想将如下所示的一些文本放入变量中。

```dataview
表没有 ID 页号为 no,链接(文件名,主题)为名称
WHERE back-to = this.file.link
SORT file.name asc
SORT page-no asc
```

我尝试了以下命令:

original="```dataview\nTABLE WITHOUT ID page-no as no, link(file.name, topic) as name\nWHERE back-to = this.file.link\nSORT file.name asc\nSORT page-no asc\n```"

但我收到此错误:

bash: command substitution: line 1: syntax error near unexpected token `('                                  bash: command substitution: line 1: `dataview\nTABLE WITHOUT ID page-no as no, link(file.name, topic) as name\nWHERE back-to = this.file.link\nSORT file.name asc\nSORT page-no asc\n'

怎样做才是正确的...

答案1

来自man bash(强调我的):

将字符括在双引号中可保留引号内所有字符的字面值,除了$、`、,以及,当启用历史扩展时,!。

由于反引号不会按字面意思保留,因此 shell 将它们解析为命令替换 - 这里需要单引号,它保留所有字符的字面值。

OTOH,反斜杠像\nare一样转义不是在单引号或双引号字符串中进行特殊处理 - 如果您想要换行符,您可以逐字包含它们。所以:

original='```dataview
  TABLE WITHOUT ID page-no as no, link(file.name, topic) as name
  WHERE back-to = this.file.link
  SORT file.name asc
  SORT page-no asc
  ```'

$ echo "$original"
```dataview
  TABLE WITHOUT ID page-no as no, link(file.name, topic) as name
  WHERE back-to = this.file.link
  SORT file.name asc
  SORT page-no asc
  ```

如果你确实想使用\n,你可以在 bash 中使用ANSI C 引用,

original=$'```dataview\nTABLE WITHOUT ID page-no as no, link(file.name, topic) as name\nWHERE back-to = this.file.link\nSORT file.name asc\nSORT page-no asc\n```'

或者使用 shell 的内置printf函数:

printf -v original '```dataview\nTABLE WITHOUT ID page-no as no, link(file.name, topic) as name\nWHERE back-to = this.file.link\nSORT file.name asc\nSORT page-no asc\n```'

但恕我直言,这些更难阅读。

相关内容