bash允许扩展。我的说:$'string'
man bash
形式的词被特殊对待。单词扩展为,用 ANSI C 标准指定的反斜杠转义字符替换。反斜杠转义序列(如果存在)按如下方式解码: alert (bell) backspace 转义字符 换行符 换行符 回车 水平制表符 垂直制表符 反斜杠 单引号 双引号 八位字符,其值为八进制值(一到三数字) 八位字符,其值为十六进制值
$'string'
string
\a
\b
\e
\E
\f
\n
\r
\t
\v
\
\'
\"
\nnn
nnn
\xHH
HH
(一个或两个十六进制数字) 一个控制字符
\cx
x
扩展的结果是单引号的,就好像美元符号不存在一样。
但是为什么bash不将$'\0'
and$'\x0'
转换为空字符呢?
是否记录在案?有原因吗?(它是一个特性还是一个限制,甚至是一个错误?)
$ hexdump -c <<< _$'\0'$'\x1\x2\x3\x4_'
0000000 _ 001 002 003 004 _ \n
0000007
echo
给出预期的结果:
> hexdump -c < <( echo -e '_\x0\x1\x2\x3_' )
0000000 _ \0 001 002 003 _ \n
0000007
我的 bash 版本
$ bash --version | head -n 1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
为什么echo $'foo\0bar'
不表现为echo -e 'foo\0bar'
?