2012-08-15 117 views
38

我需要一个字符串传递给程序从猛砸CLI它的参数,如美元符号如何影响Bash中的单引号?

program "don't do this" 

字符串可以包括像'$'任何字符,'\',等等,我不想猛砸做任何修改。所以我想用单引号。

但是以下不工作:

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 

第一种方法似乎是它获得预修改逊色(把美元符号在前面并且每\替换为\\),但我不知道美元符号可以做什么。

我真的GOOGLE了这一点,但我无法找到我所需要的...

+4

为了更好地理解'$“...”'例子,看看[bash的信息页面]第一款(http://www.gnu.org/software/bash /manual/html_node/ANSI_002dC-Quoting.html#ANSI_002dC-报价) – suvayu 2012-08-15 08:53:26

+0

感谢您发布此问题。理解如何对齐制表符分隔的记录(即'cat myData.tsv | column -t -s $'\ t'') – 2017-03-20 23:26:23

回答

48

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

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

(所以在处理一个傻傻的方式选项卡,所以尝试这一个主场)

+0

+1是非常重要的。我想这是因为变量名扩展了吗? – 2012-08-15 08:49:29

+0

不,发生这种情况是因为它是'$'...''定义的行为。 – 2012-08-15 08:50:01

+0

这正是我所需要的,如果这全是$''呢! – user1206899 2012-08-15 09:29:26

18

使用$作为前缀告诉Bash试图找到具有该名称的变量。 $'是启用ANSI-C字符串处理的特殊语法(fully explained here)。在这种情况下,单个时间表不是“直到下一个单个时间点才逐字记录”。它应该是相当安全的使用。缺点是只有BASH而且不常见,所以很多人会想知道它的意思。

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

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

+0

是的,这是正确的方式 – user1206899 2012-08-15 09:57:21

+2

看到''“'”''也很常见。例如''''狗''''的尾巴' – 2012-08-15 13:17:05

+0

$'SHELL'和$'LANG'将*不*失败*。美元符号$'具有不同的功能。我会说'\''是一种正确的方式。 – jox 2014-10-14 08:53:07

-1

你不会找到一个比一个更快或更有效的方式:

eval RESULT=\$\'$STRING\' 

原因之一,这是什么样的事情,EVAL是有,你避免分叉子的疯狂的代价正如前面的答案似乎表明的那样。你的榜样:

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

这是对语法在Bash中意味着什么的误解。 '$'...''是[C风格的字符串](http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting),它遵循与普通字符串不同的引用规则,如本页其他答案中所述。 – tripleee 2017-08-11 03:53:24