我正在运行以下脚本,该脚本有一个函数用于告诉我一个日期是否在另一个日期之前,如脚本的最底部所示。
现在,脚本有一些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
结果不正确,我知道。但我稍后会解决这个问题。什么是创建这些文件以及如何阻止它?感谢。
答案 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"