为什么我的bash脚本在没有告诉它的情况下创建文件?

时间:2015-09-17 18:42:28

标签: bash file shell scripting osx-yosemite

我正在运行以下脚本,该脚本有一个函数用于告诉我一个日期是否在另一个日期之前,如脚本的最底部所示。

现在,脚本有一些bug。但其中一个特别奇怪。该脚本创建由最后一个参数输入的日期命名的文件。

它会创建名为“09”,“12”和“2015”的文件。为什么要创建这些文件?这是功能。你会注意到最后几行用输入调用函数

function compare_two {
if [ $1 < $2 ];
then
        return 2
elif [ $1 > $2 ];
then
        return 3
else
        return 4
fi
}


function compare_dates {
# two input arguments:
# e.g.  2015-09-17 2011-9-18

date1=$1
date2=$2

IFS="-"


test=( $date1 )
Y1=${test[0]}
M1=${test[1]}
D1=${test[2]}

test=( $date2 )
Y2=${test[0]}
M2=${test[1]}
D2=${test[2]}

compare_two $Y1 $Y2
if [ $? == 2 ];
then
        echo "returning 2"
        return 2
elif [ $? == 3 ];
then
        return 3
else
        compare_two $M1 $M2;
        if [ $? == 2 ];
        then
                echo "returning 2"
                return 2
        elif [ $? == 3 ];
        then
                return 3
        else
                compare_two $D1 $D2;
                if [ $? == 2 ];
                then
                        echo $?
                        echo "return 2"
                        return 2
                elif [ $? == 3 ];
                then
                        echo "returning 3"
                        return 3
                else
                        return 4
                fi
        fi
fi
}

compare_dates 2015-09-17 2015-09-12
echo $?

结果不会引发错误,而是输出

returning 2
2

结果不正确,我知道。但我稍后会解决这个问题。什么是创建这些文件以及如何阻止它?感谢。

2 个答案:

答案 0 :(得分:2)

较低和较大的符号被解释为重定向。 输入man test并找出正确的语法

答案 1 :(得分:0)

问题在于[ $1 < $2 ]<被理解为重定向字符。

解决方案是使用以下任何替代方案:

[ $1 \< $2 ]
[ $1 -lt $2 ]
(( $1 < $2 ))                     # works in bash.

[[$ 1&lt; $ 2]]不是整数比较,但是(来自手册):

  

«&lt;和&gt;运算符使用当前语言环境按字典顺序排序»

我建议您使用(( $1 < $2 ))选项。

为了避免在算术扩展中比较某些数字(以零开头的数字)如08引起问题的问题,请使用:

(( 10#$1 < 10#$2 ))
(( 10#$1 > 10#$2 ))

强制数字的基数为10。

然而,如果可能的话,使用GNU日期会更容易IMhO(它将年/月/日转换成一个单独的数字进行比较:自纪元以来的秒数):

a=$(date -d '2015-09-17' '+%s');
b=$(date -d '2015-09-12' '+%s');
compare_two "$a"  "$b"