【问题标题】:Value too great for base (error token is "08") [duplicate]基础值太大(错误标记为“08”)[重复]
【发布时间】:2018-11-28 11:00:13
【问题描述】:

这里我的问题是找出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

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    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)) ]]
    

    【讨论】:

    • 问题是前导0,这会导致shell将字符串解释为八进制。试试这个stackoverflow.com/a/12821845/1419315 解决方案:if [[ ${vara#0} -lt ${varb#0} ]]
    • 你可以用n#明确指定基数,所以10#08会被识别出来。
    • 谢谢!这似乎也适用于任何算术表达式,例如。 $(( 10#$vara - 8 ))
    • 这也有效:VariableWithLeadingZero=$(echo $VariableWithLeadingZero | sed 's/^0*//')
    • [[ ${vara#0} -lt ${varb#0} ]] 会中断具有多个前导零的数字(例如 008)。 [[ 10#$vara -lt 10#$varb ]](( 10#$vara < 10#$varb )) 适用于此类数字。
    猜你喜欢
    • 2014-03-12
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多