LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1022|回复: 6

有没有简单的 Shell 版本比较代码?

[复制链接]
发表于 2005-5-8 12:38:02 | 显示全部楼层 |阅读模式
我准备用 Shell 来写比较版本号的代码,版本号的定义与 Gentoo 相同(http://www.gentoo.org/proj/en/de ... l?part=3&chap=1)。我发现要简单的实现它似乎是不可能的,因为在 Shell 里,即使加上 sed 和 awk 也不能简单地操作字符串。不过我不太确定;请问有没有可能书写简单的代码来对两个不同的版本号作比较?(我现在使用 C 写了一段程序来完成它。)

谢谢。
发表于 2005-5-8 13:17:12 | 显示全部楼层
不了解GENTOO的版本号定义,能直接说出想实现什么功能吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-8 14:08:15 | 显示全部楼层
Post by 弥敦路九号
不了解GENTOO的版本号定义,能直接说出想实现什么功能吗?

就是从不同的版本里选出最新的,什么是最新的版本在上面给出的链接里定义。现在的代码是 C 写的,而且比较复杂。我只是想知道有没有简单的方法,因为现在的代码可以工作。
回复 支持 反对

使用道具 举报

发表于 2005-5-8 16:43:52 | 显示全部楼层
偶也不是很明确具体要做什么工作要不把你的c程序贴上来看看!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-8 20:10:07 | 显示全部楼层
下面是我现在的代码。为了依赖最少的程序,我只是用了 ANSI C 和 POSIX yacc。直接运行 make 就可以编译了:
  1. $ mv vercmp.y.txt vercmp.y
  2. $ mv makefile.txt makefile
  3. $ make
复制代码

程序的任务就是比较两个不同的版本号,并将更新的那一个打印出来。版本号的定义以及新版本的定义是参照 Gentoo Ebuild Policy 定义的,网址在第一贴。下面是我试着执行的一些结果:
  1. $ ./vercmp 1.2 1.3; echo
  2. 1.3
  3. $ ./vercmp 1.2.6 1.2.6.1; echo
  4. 1.2.6.1
  5. $ ./vercmp 1.2.6-r4 1.2.6-r5; echo
  6. 1.2.6-r5
  7. $ ./vercmp 1.2.6_pre7 1.2.6; echo
  8. 1.2.6
  9. $ ./vercmp 1.2.6_p7 1.2.6; echo
  10. 1.2.6_p7
  11. $ ./vercmp 1.2.6_alpha7-r3 1.2.6_alpha7-r7; echo
  12. 1.2.6_alpha7-r7
  13. $
复制代码

如果两个版本号中的任何一个不符合 Gentoo Policy 中的定义,vercmp 不打印任何内容并且向环境返回非零值。

请大家帮忙看一下:
1. 有没有办法用 shell 脚本实现?
2. 有没有更简单的实现?
3. 如果有兴趣,请您帮忙测试一下。

非常感谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2005-5-9 17:55:08 | 显示全部楼层
规则本身就很复杂,有必要用shell实现么?何况shell操作起来不如c顺手,说不定代码量还要大。如果说硬要实现肯定是可以的,因为shell很强大,但是没有这个必要,除非你想练习。这个你还可以在程序中加上对版本的规范检查,看看满足不满足gentoo的版本号的规范。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-9 18:27:07 | 显示全部楼层
Post by qhgary
规则本身就很复杂,有必要用shell实现么?何况shell操作起来不如c顺手,说不定代码量还要大。如果说硬要实现肯定是可以的,因为shell很强大,但是没有这个必要,除非你想练习。这个你还可以在程序中加上对版本的规范检查,看看满足不满足gentoo的版本号的规范。

使用 shell 确实有一些原因。首先,shell 脚本无需编译就可执行,而编译程序通常会引入一些问题,例如没有编译的环境。这样,为了编译源程序,就需要安装另外一些软件,增加了编译的依赖性。如果只使用 POSIX shell 的功能,就可以保证程序在任何一种支持 POSIX shell 的 shell 里执行,这是另一个优点。

我已经阅读了两个版本,一个是 Portage 里的代码,用 Python 写成;另一个是一个 Eclass,完全用 bash 写成。现在看来,Portage 里的代码是健壮的,但由于我不能依赖除 shell 以外的任何脚本语言,很多语言特性无法使用;bash 脚本具有基本的功能,但是使用了一些 bash 的特性,最重要的是不够健壮。所以,对于这个应用,我还是选择了我现在的程序。
回复 支持 反对

使用道具 举报

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

本版积分规则

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