要强制在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中的错误吗?
答案 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 EVALUATION
和man bash
部分。