Bash中的数字基础

时间:2013-07-12 14:04:00

标签: 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

给我错误

-bash: [: 10#08: integer expression expected

这是bash中的错误吗?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

[ $(($x)) -lt $(($y)) ][[ $x -lt $y ]]怎么样?

答案 2 :(得分:0)

不是错误。 shell不在条件表达式中进行算术求值。有关何时进行算术评估的详细信息,请参阅Arithmetic Expansion中的ARITHMETIC EVALUATIONman bash部分。