9uzman7 Asked: 2020-01-31 08:10:44 +0800 CST2020-01-31 08:10:44 +0800 CST 2020-01-31 08:10:44 +0800 CST '$ 在 bash 中是什么意思? 772 我想获取一个字符的ASCII码,所以我有以下内容: VAR="a" NUM=$(printf "%d" "'$VAR") echo $NUM '$在这种情况下是什么意思?有人可以指出我的文档来理解语法吗?我不明白它是否属于$(...)orprintf或bash. bash shell 3 个回答 Voted muru 2020-01-31T08:18:26+08:002020-01-31T08:18:26+08:00 '$没有什么特别的意思。使用%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 值。 如评论中所述,任何剩余的字符都将被忽略。 Best Answer codelahoma 2020-01-31T08:41:23+08:002020-01-31T08:41:23+08:00 这'是 printf 参数的一部分(请参阅此处的参数部分)。 $是常规 shell 扩展的一部分,因此参数 printf变为%dand 'a。 最后,$(...)construct 是Command Substitution,在这种情况下意味着NUM它的值设置为printf函数的输出。 user392879 2020-01-31T20:04:54+08:002020-01-31T20:04:54+08:00 正如已经说过的,它'$本身并不意味着任何特别的东西。您"'$VAR"的扩展为'a,它将作为参数传递给printf实用程序。 然后是有趣的部分—— printf(shell 实用程序,而不是 C 语言中的函数)的一个晦涩但标准的特性。 根据 SuSv4标准(重点是我的): 如果相应的转换说明符是 , , 或 , 则参数操作数 [to printf] 应被视为字符串,并且如果相应的转换说明符是b, , , , , ,c或,s则应像由strtod()函数评估一样。aAeEfFgG 否则 [例如,如果转换说明符是d],它们应被评估为无后缀的 C 整数常量,如 ISO C 标准所述,具有以下扩展: 一个领先<plus-sign>或<hyphen-minus>应被允许。 如果前导字符是单引号或双引号,则该值应为单引号或双引号后字符的基础代码集中的数值。 可以允许带后缀的整数常量。 如果您的 shell 支持多字节字符(与 UTF-8 一样,任何现代系统的默认值),该数值将是完整字符的数值,而不是其前导字节的数值: % printf '%d\n' '"á' "'é" 225 233 % printf 'U+%X\n' '"猫儿' U+732B 请注意,这不是字符的“ASCII 值”——bash 联机帮助页的描述充其量只是误导。 但是,bash(以及除 yash 之外的大多数其他 shell)不符合标准,因为即使使用诸如for之类的浮点说明符,它们也会执行该转换g,这明显违反了上面的第一段,即strtod()应该在这种情况下使用: % bash --posix -c 'printf "%f\n" \"Q' 81.000000
'$
没有什么特别的意思。使用%d
inprintf
,它会尝试将参数评估为整数表达式。'a
被视为char
a
,或整数 97。即使您不使用变量扩展,您也会得到相同的结果:从(强调我的)的bash文档中:
printf
如评论中所述,任何剩余的字符都将被忽略。
这
'
是 printf 参数的一部分(请参阅此处的参数部分)。$
是常规 shell 扩展的一部分,因此参数printf
变为%d
and'a
。最后,
$(...)
construct 是Command Substitution,在这种情况下意味着NUM
它的值设置为printf
函数的输出。正如已经说过的,它
'$
本身并不意味着任何特别的东西。您"'$VAR"
的扩展为'a
,它将作为参数传递给printf
实用程序。然后是有趣的部分——
printf
(shell 实用程序,而不是 C 语言中的函数)的一个晦涩但标准的特性。根据 SuSv4标准(重点是我的):
如果您的 shell 支持多字节字符(与 UTF-8 一样,任何现代系统的默认值),该数值将是完整字符的数值,而不是其前导字节的数值:
请注意,这不是字符的“ASCII 值”——bash 联机帮助页的描述充其量只是误导。
但是,bash(以及除 yash 之外的大多数其他 shell)不符合标准,因为即使使用诸如
f
or之类的浮点说明符,它们也会执行该转换g
,这明显违反了上面的第一段,即strtod()
应该在这种情况下使用: