bash 中的“$”是什么意思?

bash 中的“$”是什么意思?

我想获取一个字符的ASCII码,所以我有以下内容:

VAR="a"
NUM=$(printf "%d" "'$VAR")
echo $NUM

'$在这种情况下意味着什么?有人可以指出我的文档来理解语法吗?我不明白它是否属于$(...)orprintf或 的一部分bash

答案1

'$没有什么特别的意思。使用%din 时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

'是 printf 参数的一部分(请参阅参数部分这里)。

是 $常规 shell 扩展的一部分,因此printf参数变为%d'a

最后,$(...)构建为命令替换,在本例中意味着NUM将其值设置为函数的输出printf

答案3

正如已经说过的,'$本身并没有什么特别的意义。您的"'$VAR"内容扩展为'a,它将作为参数传递给printf实用程序。

接下来是有趣的部分—— printf(shell 实用程序,而不是 C 语言中的函数)的一个不起眼但标准的功能。

根据SuSv4标准(强调我的):

如果相应的转换说明符是、、 或,则参数操作数 [to printf] 应被视为字符串,并且如果相应的转换说明符是、、、、、、或 ,则应按函数进行计算。bcsstrtod()aAeEfFgG

否则 [例如,如果转换说明符是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

相关内容