Bash中的数字基

roj*_*oke 1 bash arithmetic-expressions

要强制在base10中解释数字,可以在前缀10#之前加上数字。特别是10#08和10#09将被解释为有效的十进制数字,而不是无效的八进制数字。(我的输出为date +%S

但是,似乎我无法在比较中使用该变量:

x=10#08
y=10#20
echo $((x+y))           // (returns 28, as expected)

while [ $x -lt $y ]
do
  x=$((x++))
done
Run Code Online (Sandbox Code Playgroud)

给我错误

-bash: [: 10#08: integer expression expected
Run Code Online (Sandbox Code Playgroud)

这是bash中的错误吗?

Gor*_*son 6

bash的[内建函数主要模拟旧的标准[命令(又名test,是的,它确实是一个命令),它不知道这些新的基标记。但是bash的算术表达式((( )))和条件表达式([[ ]])可以:

$ x=10#08
$ y=10#20
$ echo $((x+y))
28
$ [ $x -lt $y ] && echo yes
-bash: [: 10#08: integer expression expected
$ /bin/[ $x -lt $y ] && echo yes   # This uses external test cmd instead of builtin
[: 10#08: bad number
$ [[ $x -lt $y ]] && echo yes
yes
$ ((x<y)) && echo yes
yes
Run Code Online (Sandbox Code Playgroud)

对于纯算术测试,(( ))通常最容易使用。但是两者都是bash扩展名(即,在brand-X shell中不可用),因此请确保使用#!/bin/bash而不是来启动脚本#!/bin/sh