我正在寻找一种通过命令行转换十六进制的方法,发现有一个非常简单的方法echo $((0x63))
。
它工作得很好,但我对这里发生的事情有点困惑。
我知道它$(...)
通常是一个子 shell,其中的内容在外部命令之前进行评估。
这种情况下还是子shell吗?我认为不是,因为这意味着子 shell 只是评估(0x63)
哪个不是命令。
有人可以帮我分解这个命令吗?
答案1
$(...)
是一个命令替换(不仅仅是一个子shell),而且$((...))
是一个算术扩展。
当您使用 时$((...))
,...
将被解释为算术表达式。这意味着,除其他外,十六进制字符串将被解释为数字并转换为十进制。然后整个表达式将被表达式求值的数值替换。
与参数扩展和命令替换一样,$((...))
应该用引号引起来,以免受到 shell 的分词和文件名通配的影响。
echo "$(( 0x63 ))"
附带说明一下,算术表达式中出现的变量不需要它们$
:
$ x=030; y=30; z=0x30
$ echo "$(( x + y +x ))"
78
答案2
这不是子shell,而是算术评估。从man bash
:
((表达))
该表达式根据下面描述的规则进行计算算术评估。如果表达式的值非零,则返回状态为0;否则返回状态为1。这与let“表达式”完全相同。