领先的美元符号如何影响Bash中的单引号?

时间:2012-08-15 08:40:41

标签: bash quotes double-quotes single-quotes

我需要将一个字符串作为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

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

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

3 个答案:

答案 0 :(得分:68)

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

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

(并且SO以愚蠢的方式处理标签,所以在家尝试这个标签)

答案 1 :(得分:23)

使用$作为前缀告诉BASH尝试查找具有该名称的变量。 $'是一种特殊语法(fully explained here),它支持ANSI-C字符串处理。在这种情况下,单个刻度不是“在下一个刻度之前逐字取值”。它应该是非常安全的。缺点是它只是BASH并且非常罕见,所以很多人都会想知道这意味着什么。

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

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

答案 2 :(得分:-1)

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

eval RESULT=\$\'$STRING\'

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

$ foo='\u25b6'
$ eval bar=\$\'$foo\'
$ echo "$bar"
▶