美元标志如何影响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" ▶