我想获取一个字符的ASCII码,所以我有以下内容:
VAR="a"
NUM=$(printf "%d" "'$VAR")
echo $NUM
'$
在这种情况下意味着什么?有人可以指出我的文档来理解语法吗?我不明白它是否属于$(...)
orprintf
或 的一部分bash
。
答案1
'$
没有什么特别的意思。使用%d
in 时printf
,它尝试将参数计算为整数表达式。'a
被视为char
a
, 或整数 97。即使不使用变量扩展,也会得到相同的结果:
$ printf %d\\n "'a'"
97
$ printf %d\\n "'0'"
48
$ printf %d\\n "'"$'\1'
1
从bash 文档printf
(强调我的):
非字符串格式说明符的参数被视为 C 语言常量,但允许使用前导加号或减号,并且如果前导字符是单引号或双引号,则该值为后续字符的 ASCII 值。
正如评论中所述,剩下的任何字符都将被忽略。
答案2
答案3
正如已经说过的,'$
本身并没有什么特别的意义。您的"'$VAR"
内容扩展为'a
,它将作为参数传递给printf
实用程序。
接下来是有趣的部分—— printf
(shell 实用程序,而不是 C 语言中的函数)的一个不起眼但标准的功能。
根据SuSv4标准(强调我的):
如果相应的转换说明符是、、 或,则参数操作数 [to
printf
] 应被视为字符串,并且如果相应的转换说明符是、、、、、、或 ,则应按函数进行计算。b
c
s
strtod()
a
A
e
E
f
F
g
G
否则 [例如,如果转换说明符是
d
],它们应被评估为无后缀的 C 整数常量,如 ISO C 标准所述,具有以下扩展:
允许使用前导
<plus-sign>
or 。<hyphen-minus>
如果主角是一个单引号或双引号,该值应为数值在底层代码集中后面的字符的单引号或双引号。
- 可以允许带后缀的整数常量。
如果您的 shell 支持多字节字符(与 UTF-8 一样,这是任何现代系统的默认设置),则该数值将是完整字符的值,而不是其前导字节的值:
% printf '%d\n' '"á' "'é"
225
233
% printf 'U+%X\n' '"猫儿'
U+732B
请注意,这不是字符的“ASCII 值”——描述因为 bash 联机帮助页充其量只是误导性的。
然而,bash(以及除 yash 之外的大多数其他 shell)不符合标准,因为即使使用像f
或 这样的浮点说明符g
,它们也会执行该转换,这明显违反了上面的第一段,该段说strtod()
应该在这种情况下使用:
% bash --posix -c 'printf "%f\n" \"Q'
81.000000