77

我需要从 Bash CLI 将字符串作为参数传递给程序,例如

program "don't do this"

该字符串可能包含任何字符,如'$','\'等,我不希望 Bash 进行任何修改。所以我考虑使用单引号。

但是以下方法不起作用:

 program 'don\'t do this'            //escape doesn't work in single quote

虽然以下两项有效:

 program $'dont\'t do this'          //seems fine, but any other side effects?
 program 'dont'\''do this'           //breaking into 3 parts

第一种方法似乎更好,因为它获得的预修改更少(将美元符号放在前面并将每个替换\\\),但我不知道美元符号还能做什么。

我真的用谷歌搜索了这个,但我找不到我需要的东西......

4

3 回答 3

110

它会导致转义序列被解释。

$ echo $'Name\tAge\nBob\t24\nMary\t36'
Name    Age
Bob     24
Mary    36

扩展这些序列后,结果是单引号,就好像美元符号不存在一样。

于 2012-08-15T08:46:16.940 回答
36

用作前缀告诉BASH$尝试查找具有该名称的变量。$'是一种特殊语法(在此处进行了充分解释),它支持 ANSI-C 字符串处理。在这种情况下,单个刻度不是“在下一个刻度之前逐字获取值”。使用起来应该很安全。缺点是它只是 BASH 并且非常少见,所以很多人会想知道它的含义。

更好的方法是使用单引号。如果您需要字符串中的单引号,则需要将其替换为'\''. 这将结束前一个单引号字符串,为其添加一个单引号 ( \'),然后开始一个新的单引号字符串。这种语法适用于Bourne shell的任何后代,它很容易理解并且大多数人很快就能识别出这种模式。

另一种方法是替换每个单引号,'"'"'它转换为“终止当前的单引号字符串,附加仅包含一个单引号的双引号字符串,重新启动单引号字符串”。这避免了转义字符并且看起来很好对称。如果您需要在双引号字符串中使用双引号,它也可以反过来工作:"'"'"

于 2012-08-15T08:48:14.763 回答
-1

您找不到比以下更快或更有效的方法:

eval RESULT=\$\'$STRING\'

一方面,这是eval的用途,并且您可以避免在所有地方分叉子流程的疯狂成本,正如之前的答案似乎暗示的那样。你的例子:

$ foo='\u25b6'
$ eval bar=\$\'$foo\'
$ echo "$bar"
▶
于 2015-01-06T10:11:37.707 回答