1

要强制在 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中的错误吗?

4

3 回答 3

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

对于纯算术测试,(( ))通常最容易使用。但两者都是 bash 扩展(即在 brand-X shell 中不可用),因此请务必以 . 开头#!/bin/bash,而不是#!/bin/sh.

于 2013-07-12T14:38:03.357 回答
1

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

于 2013-07-12T14:18:54.653 回答
1

不是错误。shell 不在条件表达式中进行算术评估。有关何时完成算术评估的详细信息,请参阅章节Arithmetic ExpansionARITHMETIC EVALUATIONin 。man bash

于 2013-07-12T14:29:22.920 回答