U. *_*ndl 0 bash variable-substitution
我在 BASH 4.3.48 (SLES12 SP4) 和 BASH 4.4.23 (OpenSUSE Leap 15.1) 中尝试从变量值中删除多个尾随空格时看到了这一点:
~> xxx="-O -Wall "
~> echo "X${xxx%% }X" # (1)
X-O -Wall X
~> echo "X${xxx%% *}X"
X-OX
~> echo "X${xxx% }X"
X-O -Wall X
~> echo "X${xxx% *}X" # (2)
X-O -Wall X
~> echo "X${xxx%% \*}X"
X-O -Wall X
Run Code Online (Sandbox Code Playgroud)
我觉得要么(1)
或者(2)
应该做这份工作。
手册规定${parameter%%word}
:
删除匹配的后缀模式。这个词被扩展以产生一个模式,就像在路径名扩展中一样。如果模式匹配参数扩展值的尾随部分,则扩展的结果是具有最短匹配模式(“%”情况)或最长匹配模式(“%”)的参数扩展值%'' 大小写)已删除。
由于它不像文档那样工作(或者我理解文档),我怀疑这是一个错误(在 BASH 的-Wall
情况下,将删除不匹配的后缀(“ ”)%% *
。我对吗?
在后缀删除中使用前缀删除:
$ xxx="-O -Wall "
$ echo "X${xxx%"${xxx##*[! ]}"}X"
X-O -WallX
Run Code Online (Sandbox Code Playgroud)
$ xxx="-O -Wall "
$ echo "X${xxx%"${xxx##*[! ]}"}X"
X-O -WallX
Run Code Online (Sandbox Code Playgroud)
一个人为的例子,但如果没有引用内部扩展,它包含的星号将被外部扩展视为壳模式。引用,它变成了字面的星号。
您观察到的行为不是错误,只是 shell 模式的工作方式很简单:
${xxx%% }
Run Code Online (Sandbox Code Playgroud)
${xxx%% *}
Run Code Online (Sandbox Code Playgroud)
-Wall
${xxx% }
Run Code Online (Sandbox Code Playgroud)
${xxx% *}
Run Code Online (Sandbox Code Playgroud)
${xxx%% \*}
Run Code Online (Sandbox Code Playgroud)
\*
是一个反斜杠转义星号,将被解释为文字星号