linux – Shell:如果a小于b,“a -lt b”是不是真的?
我没有接受过
Linux的培训,但我可以通过一些文档查找来解决问题,但我很难过.
我找到了一个脚本,它有助于在启动时在我的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”不是真的吗? 对此有任何见解将不胜感激,我很难过! 解决方法
像-lt这样的助记符可以说来自原始的Fortran比较器,如.LT.从20世纪50年代后期开始.
是的,在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 <stdio.h> #include <stdlib.h> int main(void) { char *array[] = { "021715402012","021815402012" }; for (int i = 0; i < 2; i++) { int j = atoi(array[i]); long k = strtol(array[i],10); printf("%-10s = %10d = 0x%.10lXn",array[i],j,k); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |