如何在单引号内使用变量

如何在单引号内使用变量

我有一个应用程序,它采用嵌入单引号中的双引号作为输入属性。以这个正确的命令为例:

command -p 'cluster="cl1"'

为了使其自动化,我创建了一个 bash 文件$CLUSTER作为变量。我的命令应该如何?换句话说,我应该用什么来代替 cl1?

请注意,如果我修改了上述命令,它将不会被接受。例如:command -p "cluster=cl1"不被接受

答案1

看起来您的命令可能是根据命令行上给定的参数设置环境变量。也许你可以这样做:

CLUSTER=cl1; cluster=$CLUSTER command

...并在调用时为其设置环境。

否则,shell 引号通常会分隔参数或从 shell 解释中转义其他特殊 shell 字符。你可以包含(因此逃脱)基于不同规则的其他类型中的不同类型的 shell 引号:

  • "''''"- 软引号字符串可以包含任意数量的硬引号。
  • "\""-\反斜杠可以转义软引用字符串 "中的软引用。"
    • 在这种情况下,\\反斜杠也会转义其自身、\$扩展标记和\newlines,如下所述,但按字面意思处理。
  • "${expand} and then some"- 软引用字符串可以包含解释的 shell$扩展。
  • '"\'-硬引号字符串可以包含硬引号'以外的任何字符。'
  • \- 不带引号的反斜杠将转义任何后续字符以进行字面解释 - 甚至另一个反斜杠 - \newline 除外。
    • \\newline 情况下,\反斜杠和\newline 都从生成的解释命令中完全删除。
  • ${parameter+expand "$parameter"}- 除了少数特殊情况外,由 shell 扩展产生的引号几乎从不用作分隔符标记。我不会在这里进一步描述这些。

我认为任何应用程序都会解释其命令行参数中的引号,这很奇怪。这种做法没有多大意义——至少对于 shell 来说——引用的主要目的通常是界定参数。然而,在调用时,参数总是已经划定界限\0NUL字符,所以引用没有多大作用。

即使是 shell 通常也只会在使用 switch 调用时解释其调用参数之一中的引号-c- 这表示它的第一个操作数实际上是一个 shell 脚本,它应该在调用时运行。这是一个案例两次评估输入。

尽管如此,您可以做很多事情来通过命令行上的参数传递文字引号。例如:

CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"

正如我之前在评论中指出的,您可以将"引号包含在本身被引用的扩展中"

CLUSTER=cl1; command -p "cluster=\"$CLUSTER\""

您可以在带引号的字符串中"使用反斜杠进行转义。\"

CLUSTER=cl1; command -p cluster='"'"$CLUSTER"'"'

您可以交替和连接引用样式以达到您想要的最终结果@jimmij上面的注释

CLUSTER=cl1; ( set -f; IFS=; command -p cluster=\"$CLUSTER\" )

您可以禁用两者文件名生成$IFS拆分 - 从而避免了完全引用$expansion- 因此仅引用引号。这可能有点矫枉过正了。

最后,还可以使用另一种类型的 shell 引用。正如我之前提到的,sh -c "$scriptlet"shell 调用的形式通常用于在命令行上提供 shell 脚本。当$scriptlet变得复杂时 - 例如当引号必须包含其他引号时 - 使用此处文档通常会更有利sh -s- 其中 shell 被明确指示分配所有以下内容操作数到位置参数,就像在某种-c情况下一样,但也从 中获取其脚本stdin

如果您的命令必须以这种方式解释引号,那么我认为如果它可以在文件输入中这样做会更好。例如:

CLUSTER=cl1
command --stdin <<-SCRIPT
    cluster="$CLUSTER"
SCRIPT

如果您不引用 a 的分隔符<<here-document,那么它的所有内容几乎都会被视为"软引用 -除了"引号本身没有被特殊对待。因此,如果我们运行上面的代码cat

CLUSTER=cl1
cat <<-SCRIPT
        cluster="$CLUSTER"
SCRIPT

...它打印...

cluster="cl1"

答案2

喜欢麦克塞夫写道:

 CLUSTER='"cl1"'; command -p "cluster=$CLUSTER" 

“双引号”包含空格/元字符的每个文字以及每一个扩张:"$var""$(command "$var")""${array[@]}""a & b"。用于'single quotes'代码或文字$'s: 'Costs $5 US'ssh host 'echo "$HOSTNAME"'.看
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words

相关内容