返回

在单引号内双引号中嵌入Bash变量:完整指南

Linux

在单引号内双引号中嵌入 Bash 变量

作为一位经验丰富的程序员和技术作家,我有时需要将变量放入单引号内的双引号中。这通常是通用表达式语言 (UEL) 的要求,UEL 是一种用于执行条件查询和过滤的表达式语言。

问题

例如,我需要创建一个 UEL 表达式,该表达式将“FolderParentID”属性与存储在 Bash 变量 $variable 中的 ID 进行比较:

passbolt list resource --filter 'FolderParentID == "**some-imaginary-id** "'

但我需要用 $variable 替换 some-imaginary-id

解决方案

要在单引号内的双引号中嵌入变量,请使用反斜杠 () 转义单引号。这将告诉 shell 不要将变量解释为特殊字符,而是将其视为文本的一部分。

  1. 声明 Bash 变量
variable="some-actual-id"
  1. 使用反斜杠转义
filter="'FolderParentID == \"$variable\"'"
  1. 将变量嵌入 UEL 中
passbolt list resource --filter $filter

通过执行此示例,你会看到 passbolt 命令使用嵌入的变量正确过滤资源。

注意事项

  • 确保反斜杠 () 正确转义单引号。
  • 将变量置于双引号内以防止 shell 扩展。
  • 此解决方案适用于 Bash 和类似的 shell。

常见问题解答

  1. 为什么需要转义单引号?

    反斜杠转义字符告诉 shell 不要将变量解释为特殊字符,而是将其视为文本的一部分。如果不转义单引号,shell 将尝试将变量解释为字符串,这会导致错误。

  2. 为什么需要将变量置于双引号内?

    将变量置于双引号内可防止 shell 扩展。如果不使用双引号,shell 将尝试将变量中的任何特殊字符解释为 shell 命令或通配符,这可能会导致意外结果。

  3. 这个解决方案是否适用于所有 shell?

    此解决方案适用于 Bash 和类似的 shell,例如 Zsh 和 Ksh。它可能不适用于其他 shell,例如 csh 或 tcsh。

  4. 有什么替代方法吗?

    另一种在单引号内的双引号中嵌入变量的方法是使用单引号内的反引号:

    filter='FolderParentID == `echo $variable`'
    

    但是,这种方法在某些情况下可能会出现问题,例如当变量包含反引号时。

  5. 我还可以将这个技巧用于其他情况吗?

    是的,这种技巧可用于任何需要在单引号内的双引号中嵌入变量的情况。例如,它可用于创建复杂的 shell 脚本或在配置文件中设置环境变量。