问题描述
参考: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'
被用来将特殊的换行符(以及我引用的另一篇文章中的制表符和回车符)传递回字符组。