我需要将一个字符串作为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可能还有什么做。
我真的用谷歌搜索了这个,但我找不到我需要的东西......
答案 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"
▶