我试图使用echo
以下两个命令执行新行:
第一个命令:
echo $'Hello World\nThis is a new line'
回复:
Hello World This is a new line
第二条命令:
echo $"Hello World\nThis is a new line"
回复:
Hello World\nThis is a new line
我的问题是用 in 's 包裹的字符串与用in 's$' '
包裹的字符串有什么区别?$" "
bash
echo
答案1
正如所解释的这里,语法$'string'
指定一个 C 样式字符串,其中包含魔术转义字符,例如\n
换行符。 $"string"
用于 I18N 扩展,它没有这样的魔法逃逸。
"string"
请注意,这些与更常见的(弱引用)和'string'
(强引用)不同。
答案2
位于$
中字符串的开头:
echo $'Hello World\nThis is a new line'
导致转义序列被解释。
Bash 参考手册[说]
$'string' 形式的单词会被特殊处理。该单词扩展为字符串,并按照 ANSI C 标准指定的方式替换反斜杠转义字符。 ..
..
扩展结果是单引号的,就好像美元符号不存在一样。
但
echo $"Hello World\nThis is a new line"
是完全不同的。这[ 文章 ]关于特定于语言环境的翻译说:
前面带有美元符号 ('$') 的双引号字符串将导致根据当前区域设置翻译该字符串。如果当前语言环境是 C 或 POSIX,则忽略美元符号。如果字符串被翻译并替换,则替换内容将被双引号括起来。
笔记:IIRC 两者$'string'
都$"string"
可能无法在不同的 shell 之间找到支持。来自其他 shell 的人们不仅好奇地看着它们,而且还争论是否可以为了脚本可移植性而避免这种情况。