基数值太大(错误标记为“08”)

时间:2014-07-16 09:49:22

标签: bash shell

这里我的问题是在if语句中找到使用单括号[]和双括号[[]]的区别。

#!/bin/bash
vara=08;
varb=10;

## single bracket in if statment is working.
if [ $vara -lt $varb ]; then
echo "yes";
else
echo "no";
fi


## double brackets in if statment is not working; throwing an error like below.
## [[: 08: value too great for base (error token is "08")
if [[ $vara -lt $varb ]]; then
echo "yes";
else
echo "no";
fi

1 个答案:

答案 0 :(得分:93)

shell尝试将08解释为八进制数,因为它以零开头。但是,在八进制中只允许数字0-7,因为十进制8是八进制010.因此08不是有效数字,而且这是错误的原因。

单支架是一种"兼容模式"用sh,而sh不知道八进制数。

所以,如果你使用单方括号," 010"将被解释为10,而使用双方括号," 010"将被解释为8。

如果使用单方括号," 08"将被解释为8,而使用双方括号,它不是有效数字并导致错误。

您可以使用此处描述的解决方案来避免错误:https://stackoverflow.com/a/12821845/1419315

if [[ ${vara#0} -lt ${varb#0} ]]

if [[ $((10#$vara)) -lt $((10#$varb)) ]]