linux – Shell:如果a小于b,“a -lt b”是不是真的?

前端之家收集整理的这篇文章主要介绍了linux – Shell:如果a小于b,“a -lt b”是不是真的?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我没有接受过@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”不是真的吗?

对此有任何见解将不胜感激,我很难过!

最佳答案
像-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 dio.h>
#include 

猜你在找的Linux相关文章