美元标志如何影响Bash中的单引号?

我需要从Bash CLI传递一个string作为它的参数,例如

program "don't do this" 

该string可能包含任何字符,如'$''\'等,我不希望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 

第一种方法似乎更好,因为它获得较less的预先修改(将美元符号放在前面并将每个\replace成\\ ),但是我不知道美元符号可以做什么。

我真的GOOGLE了,但我找不到我需要的…

它导致转义序列被解释。

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

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

使用$作为前缀告诉BASH试图find具有该名称的variables。 $'是一个特殊的语法( 在这里完整地解释 ),它使得ANSI-Cstring处理成为可能。 在这种情况下,单个时间表并不是“直到下一个单独的时间点才逐字取值”。 它应该是相当安全的使用。 缺点是只有BASH而且很less见,所以很多人会想知道它是什么意思。

更好的方法是使用单引号。 如果你需要一个string单引号,你需要用'\''replace它。 这结束了以前的单引号string,添加一个单引号( \' ),然后启动一个新的单引号string。 这个语法适用于Bourne shell的任何后代,这是很容易理解的,大多数人很快就会认识到这个模式。

替代方法是用'"'"'代替每个单独的记号,这意味着“终止当前单引号string,附加双引号string,只包含一个单引号,重新启动单引号string”。 这避免了转义字符,看起来很好对称。 如果您需要在双引号string中使用双引号: "'"'" ,则也可以使用其他方法。

你不会find比以下更快或更有效的方法:

 eval RESULT=\$\'$STRING\' 

首先,这就是eval在那里的一种东西,而且你避免了在所有地方分叉subprocess的疯狂代价,正如前面的答案似乎表明的那样。 你的例子:

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