免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: wuw7983
打印 上一主题 下一主题

请教一个比较数字大小的SHELL编程问题 [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
11 [报告]
发表于 2004-11-21 20:21 |只看该作者

请教一个比较数字大小的SHELL编程问题

man test

论坛徽章:
0
12 [报告]
发表于 2007-12-29 11:24 |只看该作者
KSH/BSH中最好用(())操作符来进行数字比较。运行一下的例子就明白了:
!/usr/dt/bin/dtksh

compare1()
{
   if [[ "$i" < "$j" ]]
   then
      echo $i '<' $j
   else
      echo $i '>=' $j
   fi
}
compare2()
{
   if (( $i < $j ))
   then
      echo $i '<' $j
   else
      echo $i '>=' $j
   fi
}

echo 'use [[ for arithmetic comparison:'
i=2; j=5
compare1
i=2; j=10
compare1

echo 'use (( for arithmetic comparison:'
i=2; j=5
compare2
i=2; j=10
compare2


运行输出:
use [[ for arithmetic comparison:
2 < 5
2 >= 10
use (( for arithmetic comparison:
2 < 5
2 < 10

论坛徽章:
0
13 [报告]
发表于 2007-12-30 02:03 |只看该作者
[[ $a -gt $b ]] && ....

论坛徽章:
0
14 [报告]
发表于 2007-12-30 14:17 |只看该作者

  1. function cmp(){
  2.         #判断正负
  3.         sa=${1:0:1}
  4.         sb=${2:0:1}
  5.         [ "$sa" == "-" -a "$sb" != "-" ] && echo -1 && return
  6.         [ "$sa" != "-" -a "$sb" == "-" ] && echo 0 && return
  7.         if [ "$sa" == "-" -a "$sb" == "-" ];then
  8.                 set -- ${2:1} ${1:1}
  9.         fi

  10.         a=${1%.*}
  11.         [ -z "$a" ] && a=0
  12.         ai=0
  13.         [ "X$a" != "X$1" ] && ai=${1#*.}
  14.         [ -z "${ai}" ] && ai=0
  15.         b=${2%.*}
  16.         [ -z "$b" ] && b=0
  17.         bi=0
  18.         [ "X$b" != "X$2" ] && bi=${2#*.}

  19.         if [ ${#ai} -gt ${#bi} ] ; then
  20.                 while [ ${#bi} -ne ${#ai} ]
  21.                 do
  22.                         bi="${bi}0"
  23.                 done
  24.         else
  25.                 while [ ${#ai} -ne ${#bi} ]
  26.                 do
  27.                         ai="${ai}0"
  28.                 done
  29.         fi

  30.         if [ ${#a} -gt ${#b} ] ; then
  31.                 while [ ${#b} -ne ${#a} ]
  32.                 do
  33.                         b="0${b}"
  34.                 done
  35.         else
  36.                 while [ ${#a} -ne ${#b} ]
  37.                 do
  38.                         a="0${a}"
  39.                 done
  40.         fi

  41.         [ "${a}.${ai}" \> "${b}.${bi}" ] && echo 1 && return
  42.         [ "${a}.${ai}" == "${b}.${bi}" ] && echo 0 && return
  43.         [ "${a}.${ai}" \< "${b}.${bi}" ] && echo -1 && return
  44. }
复制代码


这是用bash写的一个比较数的函数。

想法是把数分解为小数和整数部分,然后在不改变数的值的情况下,将两个数的长度对齐。
方法是:整数部分在左边添加0,小数部分在右边添加0

然后对两个数进行字符串的比较

如果两个数都是负数,那么就把负数去掉,然后对调两个数

返回结果,当a<b的时候,显示-1
a=b的时候,显示0
a>b的时候,显示1

数值的大小不限。

[ 本帖最后由 springwind426 于 2007-12-30 14:18 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP