我没有接受过@L_301_0@的培训,但我可以通过一些文档查找来解决问题,但我很难过.
我找到了一个脚本,它有助于在启动时在我的dd wrt路由器上设置日期,但前提是当前日期小于存储日期.如果你愿意,我可以分享整个脚本,但是归结为这个声明在我预期的时候没有评估为真.我将文字放入,而不是变量,它仍然不返回true,它执行“else”语句:
if [ 021715402012 -lt 021815402012 ]
then
echo "the first seems less than the second"
else
echo "the first does not seem less than the second for some reason"
fi
我希望“第一个似乎不到第二个”,但事实并非如此……
这是溢出问题吗?我试着把它变成一个像这样的字符串比较:
if [ x021715402012 -lt x021815402012 ]
并试着把它放在引号中:
if [ "x021715402012" -lt "x021815402012" ]
它总是执行其他.如果a小于b,“a -lt b”不是真的吗?
对此有任何见解将不胜感激,我很难过!
是的,在shell中,-lt执行’小于’数字比较. (请注意,在Perl中,数字比较是< etc,字符串比较由字母运算符表示,例如-lt!) 但是,在一些(可能很多)shell中,转换和比较可以用本地长整数格式完成.如果您使用的是32位计算机,则引用的值超过32位(带符号)范围10倍左右.在64位计算机上,或者使用长long的shell,你会没事的. 十进制数的十六进制等值是021715402012 = 0x50E56BD1C和021815402012 = 0x5144C9E1C;因为8,它们不能是八进制的.(但是,如果shell确实将前导零解释为’八进制’,那么第二个数字只是021或17十进制,因为8结束了八进制数.但是,64-我测试的位shell(Mac OS X 10.7.3和RHEL 5)似乎都将它们视为十进制,而不是八进制.) 下面的示例代码,在64位下编译,给出以下输出:
021715402012 = 240565532 = 0x050E56BD1C
021815402012 = 340565532 = 0x05144C9E1C
在32位下编译,它提供以下输出:
021715402012 = 2147483647 = 0x007FFFFFFF
021815402012 = 2147483647 = 0x007FFFFFFF
如果这是你的shell中发生的事情,那么将解释-lt的结果行为.您可以通过测试两个值是否为-eq来确认它;反直觉地,在你使用32位shell将其算法限制为长(32位)有符号整数的假设下,这可能会评估为真.
#include dio.h>
#include