LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: swordhui

Help: 分解文件名的Bash函数

[复制链接]
发表于 2009-9-21 12:51:05 | 显示全部楼层
compare_revision()
{
    PA=$1
    PB=$2

    PA=${PA#-r}
    PB=${PB#-r}

    if [ $PA -lt $PB ]
    then
        return 1
    else if [$PA -eq $PB ]
    then
        return 0
    else
        return 2
    fi
    fi
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-21 20:01:33 | 显示全部楼层
Post by gaosboy;2028776


compare_revision()
{
    PA=${1#-r}
    PB=${2#-r}

    if [ $PA -lt $PB ]
    then
        return 1
    else if [$PA -eq $PB ]
    then
        return 0
    else
        return 2
    fi
    fi
}


Bingo! 非常感谢gaosboy兄.
脚本合成起来时我会给你和tomgrean兄各一份:Coffee:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-21 20:03:46 | 显示全部楼层
继续征集版本比较函数, 这个有点挑战性...

# $1 是一个版本如 2.6.9
# $2 是另一个版本 2.6.10
# 分解数字和点, 直到剩下空串为止...
# 若$1>$2, 返回 1. 若相等, 返回0. 其他返回2.
compare_version()
{
}
回复 支持 反对

使用道具 举报

发表于 2009-9-22 02:39:19 | 显示全部楼层
代码:
parse_version ()
{
    I=0
    STR=$1"."
    while true
    do
        V[$I]=${STR%%.*}

        STR=${STR#*.}

        if [ -z $STR ]
        then
            break
        fi

        I=$[ $I + 1 ]
    done

    echo ${V
  • }
    }

    至于比较~不赘述了吧
  • 回复 支持 反对

    使用道具 举报

    发表于 2009-9-22 03:48:45 | 显示全部楼层
    递归:
    1. compare_version()
    2. {
    3.         a=${1%%.*}
    4.         b=${2%%.*}
    5.         if [ -z "$a" ] && [ -z "$b" ]
    6.         then
    7.                 return 0
    8.         fi
    9.         if [ "$a"0 -gt "$b"0 ]
    10.         then
    11.                 return 1
    12.         elif [ "$a"0 -lt "$b"0 ]
    13.         then
    14.                 return 2
    15.         else
    16.                 compare_version "${1#$a.}." "${2#$b.}."
    17.                 return $?
    18.         fi
    19. }
    复制代码
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2009-9-22 11:53:30 | 显示全部楼层
    Post by gaosboy;2029011
    代码:
    parse_version ()
    {
        I=0
        STR=$1"."
        while true
        do
            V[$I]=${STR%%.*}

            STR=${STR#*.}

            if [ -z $STR ]
            then
                break
            fi

            I=$[ $I + 1 ]
        done

        echo ${V
  • }
    }

    至于比较~不赘述了吧


  • gaosboy兄的加点凑整算法真是神来之笔, 我稍作修改, 请指正.

    1. version_is1gt2()
    2. {
    3.         local STR1=$1"."
    4.         local STR2=$2"."
    5.         local V1
    6.         local V2

    7.         while true
    8.         do
    9.                 V1=${STR1%%.*}
    10.                 V2=${STR2%%.*}

    11.                 STR1=${STR1#*.}
    12.                 STR2=${STR2#*.}

    13.                 if [ -z $V1 ] || [ -z $V2 ]; then
    14.                         [ -z $V1 ] && [ -z $V2 ] && return 0
    15.                         [ -z $V2 ] && return 1
    16.                         return 2
    17.                 fi
    18.                 #echo "V1=$V1, V2=$V2"

    19.                 #compare
    20.                 [ $V1 -eq $V2 ] && continue
    21.                 [ $V1 -gt $V2 ] && return 1
    22.                 return 2

    23.         done

    24.         #never come here.
    25. }
    复制代码


    函数名修改了一下, 这样通过函数名就能知道该返回什么值, 减少用错的概率.
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2009-9-22 11:58:12 | 显示全部楼层
    Post by lastart;2029017
    递归:

    1. compare_version()
    2. {
    3.         a=${1%%.*}
    4.         b=${2%%.*}
    5.         if [ -z "$a" ] && [ -z "$b" ]
    6.         then
    7.                 return 0
    8.         fi
    9.         if [ "$a"0 -gt "$b"0 ]
    10.         then
    11.                 return 1
    12.         elif [ "$a"0 -lt "$b"0 ]
    13.         then
    14.                 return 2
    15.         else
    16.                 compare_version "${1#$a.}." "${2#$b.}."
    17.                 return $?
    18.         fi
    19. }
    复制代码


    lastart兄算法课功夫很深啊, 递归用的很酷:Coffee:
    参见过什么编程竞赛没?
    回复 支持 反对

    使用道具 举报

    发表于 2009-9-23 02:37:19 | 显示全部楼层
    太推举了,这不就是标准的递归吗。
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2009-9-24 18:33:06 | 显示全部楼层
    继续征集::help

    1. #利用以上的函数, 比较两个2个ATOM
    2. #如果相等, 返回0. $1>$2 , 返回1,  其余返回2
    3. #同时全局变量$rnew 返回较大的ATOM, 全局变量$rold 返回较小的atom.
    4. #如: bash-4.3.9.umk < bash-4.3.10.umk.

    5. atom_is1gt2()
    6. {
    7. }
    复制代码
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2009-9-24 18:37:09 | 显示全部楼层
    Post by lastart;2029320
    太推举了,这不就是标准的递归吗。


    呵呵 没有点算法基本功, 递归很难玩转:flash:
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表