repo
命令不在乎使用哪种引号。如果需要参数扩展,请使用双引号。如果这意味着你需要反斜杠转义很多内容,大部分情况下请使用单引号,然后在需要进行扩展的部分跳出单引号,切换到双引号。
repo forall -c 'literal stuff goes here; '"stuff with $parameters here"' more literal stuff'
如果你有兴趣,下面是解释。
当你从shell运行一个命令时,该命令接收的参数是一个以空字符结尾的字符串数组。这些字符串可以包含任何非空字符。
但是当shell从命令行构建这个字符串数组时,它会特殊解释一些字符;这是为了使命令更容易(实际上是可能)输入。例如,空格通常表示数组中字符串之间的边界;因此,shell中的字符串通常被称为“单词”。但是一个shell单词可能仍然包含空格;你只需要告诉shell你想要的是什么。
你可以在任何字符(包括空格或另一个反斜杠)前面使用反斜杠来告诉shell将该字符视为字面量。但是虽然你可以做类似于以下操作:
reply=\”That\'ll\ be\ \$4.96,\ please,\"\ said\ the\ cashier
...它可能会变得令人厌烦。因此,Shell提供了一个替代方案:引号。这些引号有两种主要变体。
双引号被称为“分组引号”。它们阻止通配符和别名的扩展,但主要用于在单词中包含空格。其他类似通过$
标记的参数和命令扩展仍然会发生。当然,如果你想在双引号内部使用字面上的双引号,你必须使用反斜杠进行转义:
reply="\"That'll be \$4.96, please,\" said the cashier"
单引号更严格。它们之间的所有内容都被完全按字面意义解释,包括反斜杠。在单引号内部绝对无法得到一个字面上的单引号。
幸运的是,在shell中,引号不是词的分隔符;它们本身并不终止一个词。您可以在同一个词中进入和退出引号,包括不同类型的引号之间,以获得所需的结果。
reply='"That'\''ll be $4.96, please," said the cashier'
所以这样更容易 - 反斜杠要少得多,尽管关闭单引号、反斜杠转义的字面单引号、开放单引号序列需要一些时间来适应。
现代shell添加了另一种在POSIX标准中未指定的引用样式,其中前导的单引号被前缀为美元符号。这样引用的字符串遵循与C编程语言ANSI标准版本中的字符串字面值类似的约定,因此有时被称为“ANSI字符串”,而
$'
...
'
对则被称为“ANSI引号”。在这样的字符串中,关于反斜杠被直接解释的建议不再适用。相反,它们再次变得特殊 - 你不仅可以通过在其前面加上反斜杠来包含一个字面单引号或反斜杠,而且shell还会展开ANSI C字符转义(例如换行符的
\n
,制表符的
\t
,以及具有十六进制代码
HH
的字符的
\xHH
)。然而,除此之外,它们的行为与单引号字符串相同:不进行参数或命令替换。
reply=$'"That\'ll be $4.96, please," said the cashier'
需要注意的重要事项是,在所有这些示例中,存储在
reply
变量中的单个字符串是
完全相同的。同样地,在shell完成解析命令行之后,被运行的命令无法准确地知道每个参数字符串是如何输入的 - 或者甚至是否是通过编程方式创建的,而不是手动输入的。
repo forall -c ' ...before... '"$variable"' ...after...'
- n. m.bash
会吃掉单引号。要么你不在bash
中,要么单引号不是repo
命令的一部分。 - n. m.