领先的美元符号如何影响 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 中的单引号?的主要内容,如果未能解决你的问题,请参考以下文章