在处理嵌套参数扩展时,以下哪一种是正确的引用方式?
这个:
var="${var#"${var%%[![:space:]]*}"}"
或者这个:
var="${var#${var%%[![:space:]]*}}"
我已经看到它是双向的。第一个变体是来自Stack Overflow 答案的片段。这是对该问题最受好评的答案之一(问题是关于如何从变量中修剪空白)。
我也很难找到一个有信誉的来源来解决如何在使用作为变量而不是文字文本的“单词”或“模式”时引用事物。下面两个,哪个是正确的?
这个:
strip_ext="${filename%."$filename_ext"}"
或者这个:
strip_ext="${filename%.$filename_ext}"
这似乎取决于您希望如何解释扩展的右侧。作为模式,或作为文字字符串。
在这里,未引用
*
的是一个模式,并且吃掉了整个字符串。引用的只是删除了一个字面星号:如果将模式放入变量中也是一样的:
或者在右侧使用另一个参数扩展:
(
${pat//x}
结果*
再次出现。)我尝试过的所有类似 POSIX 的 shell(Bash、ksh、yash)都得到了相同的行为。Zsh 当然是不同的,右侧的所有参数扩展都像在那里引用一样,就像它们在分词问题上所做的那样。我想有一些运算符可以在扩展中使用来改变它。
在这两种情况下,第一种方法通常是您想要的。当右侧的字符串
${var#*a}
没有被引用时,它被解释/扩展为模式。在此示例中,删除前导文本直到第一个字母a
。如果引用:${var#"*a"}
扩展将删除文字*a
. 如果在以下情况下,这可能是一个问题:可能包含
"$filename_ext"
模式字符。同样,如果$var
in"${var#"${var%%[![:space:]]*}"}"
可以包含模式字符 (*?[) 并且您不希望它们被解释为模式,则将扩展引用为:请注意,变量赋值的右侧被认为是带引号的,不需要(但不会造成伤害)引号,这两个也是正确的: