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

Posted

技术标签:

【中文标题】领先的美元符号如何影响 Bash 中的单引号?【英文标题】:How does the leading dollar sign affect single quotes in Bash? 【发布时间】:2012-08-11 13:43:19 【问题描述】:

我需要从 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

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

我真的在谷歌上搜索过这个,但我找不到我需要的东西......

【问题讨论】:

为了更好地理解$'...'的例子,请看bash info page的第一段 感谢您发布此问题。了解如何对齐制表符分隔的记录(即cat myData.tsv | column -t -s$'\t')至关重要 【参考方案1】:

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

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

这些序列展开后,结果是单引号,就好像美元符号不存在一样。

【讨论】:

+1 好收获。我猜这是因为变量名被扩展了? 不,这是因为它是为 $'...' 定义的行为。 如果这就是 $'' 所做的一切,这正是我所需要的! 这就是$' 所做的一切。它扩展了 POSIX 字符串转义(然后是一些):\a = BEL (bell, "alert"), \b = BS (backspace), \cX = control+X (eg \cG\a), \e = ESC (escape), \f = FF (换页), \n = LF (换行, 换行), \r = CR (回车), \t = HT(水平选项卡),\v = VT(垂直选项卡)。【参考方案2】:

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

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

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

【讨论】:

'"'"' 也很常见。例如'the dog'"'"'s tail' $'SHELL' 和 $'LANG' 将不会“失败”。 $' 中的美元符号具有不同的功能。我会说 '\'' 是一个正确的方式。 $'...' 的目标是包含在 POSIX 中。 [mywiki.wooledge.org/Bashism] [austingroupbugs.net/view.php?id=249] 一直在搜索这个词,直到我找到了这个答案中的链接。【参考方案3】:

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

eval RESULT=\$\'$STRING\'

首先,这就是 eval 的用武之地,并且您可以避免在所有地方分叉子进程的疯狂成本,正如之前的答案所暗示的那样。你的例子:

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

【讨论】:

这是对 Bash 中语法含义的误解。 $'...' 是 C-style string,它遵循与常规字符串不同的引用规则,如本页其他答案中所述。

以上是关于领先的美元符号如何影响 Bash 中的单引号?的主要内容,如果未能解决你的问题,请参考以下文章

如何在bash中回显包含未转义的美元符号的变量

perl中的单引号和双引号

python中,如何去掉字串自带的引号

linux bash shell 中的单引号和双引号

为啥这个 SQL 查询中的单引号会影响计算?

Python中的单引号与双引号[关闭]