Bash 参数扩展:美元符号 ($) 在模式中意味着什么?

问题描述

参考:How to remove a newline from a string in Bash

我觉得这个问题有点傻,但是当我解决问题时,我喜欢了解为什么而不是仅仅复制和粘贴我在互联网上找到的代码。 :-)

我一直在阅读 this 和 bash 手册页,在我的一生中,我无法在文档中确定这是有效语法。但是,我运行它并且可以正常工作。

为了测试,我运行了:

[me@server ~]# declare -- MY_VAR="some value
> "

这将创建一个以 \n 结尾的变量(即“某个值\n”)。

我的目标是删除末尾的 \n。

我知道下面的代码可以做到:

echo ${MY_VAR//[$'\n']}

...我不知道为什么。

我已阅读 Shell Parameter Expansion 和有关 ${parameter/pattern/string} 的部分。我还阅读了参考部分 Pattern Matching。两者都没有告诉我将美元符号 ($) 作为我认为的字符组 ([...]) 中的第一个字符具有任何特殊含义或含义是什么。另外,为什么\n需要用单引号括起来?

我还尝试了上述工作命令的以下变体,但都不起作用:

echo ${MY_VAR//['\n']}
echo ${MY_VAR//[$]}
echo ${MY_VAR//['\n'$]}
echo ${MY_VAR//[\n]}
echo ${MY_VAR//[$\n]}
echo ${MY_VAR//['$\n']}

谁能指出文档的方向,告诉我为什么需要使用美元符号 ($) 以及为什么 \n 需要用单引号括起来?

解决方法

我刚刚找到了我自己问题的答案:ANSI-C Quoting

$'string' 被特殊对待。我认为正在发生的是这个 $'string' 被用来将特殊的换行符(以及我引用的另一篇文章中的制表符和回车符)传递回字符组。

信用:https://unix.stackexchange.com/questions/48106/what-does-it-mean-to-have-a-dollarsign-prefixed-string-in-a-script