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

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

概述我没有接受过 Linux的培训,但我可以通过一些文档查找来解决问题,但我很难过. 我找到了一个脚本,它有助于在启动时在我的dd wrt路由器上设置日期,但前提是当前日期小于存储日期.如果你愿意,我可以分享整个脚本,但是归结为这个声明在我预期的时候没有评估为真.我将文字放入,而不是变量,它仍然不返回true,它执行“else”语句: if [ 021715402012 -lt 02181540201 我没有接受过 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 = 0x050E56BD1C021815402012 =  340565532 = 0x05144C9E1C

在32位下编译,它提供以下输出:

021715402012 = 2147483647 = 0x007FFFFFFF021815402012 = 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%.10lX\n",array[i],j,k);    }    return 0;}
总结

以上是内存溢出为你收集整理的linux – Shell:如果a小于b,“a -lt b”是不是真的?全部内容,希望文章能够帮你解决linux – Shell:如果a小于b,“a -lt b”是不是真的?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1030650.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存