理解 `echo $((0x63))`

理解 `echo $((0x63))`

我正在寻找一种通过命令行转换十六进制的方法,发现有一个非常简单的方法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“表达式”完全相同。

相关内容