错误值对于bash中的base来说太大了

时间:2014-12-01 03:50:33

标签: bash

下面的bash脚本用于查找在最后一秒T中修改的文件,其中T是从命令行提供的。

if [ $# -ne 1 ]; then
    echo "Wrong number of argument"
    exit 1
fi

for f in *
do
    if [ -x "$f" ]; then
        currenttime=$(date | awk '{print $4}')
        modify=$(date -r "$f" | awk '{print $4}')
        d_c=${currenttime:0:2}
        m_c=${currenttime:3:2}
        s_c=${currenttime:6:2}
        d_m=${modify:0:2}
        m_m=${modify:3:2}
        s_m=${modify:6:2}
        let "1d_c *= 24"
        let "m_c *= 60"
        let "second_c = d_c+m_c+s_c"
            let "d_m *= 24"
        let "m_m *= 60"
        let "second_m=d_m+m_m+s_m"
        let "diff=second_c-second_m"
        if [ $diff -lt $1 ]; then
            echo $f
        fi
    fi
do

NE

但是我收到了以下错误。

./recent.sh: line 46: let: 09: value too great for base (error token is "09")
./recent.sh: line 47: let: 09: value too great for base (error token is "09")
./recent.sh: line 49: let: 09: value too great for base (error token is "09")

我知道这个错误是由于变量中的值很大而且我必须使变量十进制但我不知道如何在我的情况下这样做(在let命令中,如何使它们成为十进制) )。

1 个答案:

答案 0 :(得分:2)

问题在于09由于前导0而被解释为八进制,而(正如您所推测的那样),您需要将其解释为十进制。

要解决此问题,您需要绕过let正常的convert-variable-to-number进程。而不是写,例如,这个:

let "second_c = d_c+m_c+s_c"

你应该这样写:

let "second_c = 10#$d_c + 10#$m_c + 10#$s_c"

通过预先$,您要求Bash将变量值替换为字符串 - 例如,如果d_c为{{} 1}},然后09将是10#$d_c10#09前缀告诉10#该数字应解释为base-10。


实际上,第二个想法是,当你最初填充这些变量时,最好这样做;例如:

let

这样你就无需在任何地方使用它们。 (而且,它会使任何错误更接近其源,这使得调试更容易。)