该repo
命令不在乎它得到什么样的引号。如果需要参数扩展,请使用双引号。如果这意味着你最终不得不反斜杠很多东西,对大部分内容使用单引号,然后将它们分开并在需要扩展的部分使用双引号。
repo forall -c 'literal stuff goes here; '"stuff with $parameters here"' more literal stuff'
解释如下,如果你有兴趣。
当您从 shell 运行命令时,该命令作为参数接收的是一个以 null 结尾的字符串数组。这些字符串可能绝对包含任何非空字符。
但是当 shell 从命令行构建字符串数组时,它会专门解释一些字符;这旨在使命令更容易(实际上,可能)键入。例如,空格通常表示数组中字符串之间的边界;出于这个原因,个别论点有时被称为"词"。但是一个论点可能仍然有空格。你只需要某种方式来告诉 shell 这就是你想要的。
您可以在任何字符(包括空格或另一个反斜杠)前面使用反斜杠来告诉 shell 按字面意思处理该字符。但是,虽然您可以执行以下操作:
reply=\”That\'ll\ be\ \$4.96,\ please,\"\ said\ the\ cashier
......它可能会让人厌烦。所以shell提供了一个替代方案:引号。这些有两个主要品种。
双引号称为“分组引号”。它们防止通配符和别名被扩展,但主要是为了在单词中包含空格。参数和命令扩展等其他事情(由 a 表示的那种事情$
)仍然会发生。当然,如果您想在双引号内使用文字双引号,则必须将其反斜杠:
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
制表符和\xHH
带有十六进制代码HH
)。但是,否则,它们表现为单引号字符串:不会发生参数或命令替换:
reply=$'"That\'ll be $4.96, please," said the cashier'
需要注意的重要一点是,在所有这些示例中,存储在reply
变量中的单个字符串完全相同。同样,在 shell 完成对命令行的解析之后,正在运行的命令无法准确地告诉每个参数字符串是如何实际输入的——或者即使它是输入的,而不是以某种方式以编程方式创建的。