从文件中提取版本字符串的最佳方法是什么?
时间:2020-03-05 18:54:18 来源:igfitidea点击:
我想使用一个文件来存储客户软件的当前版本号,启动脚本可以使用该文件在正确的目录中运行二进制文件。
例如,如果运行目录如下所示:
. .. 1.2.1 1.2.2 1.3.0 run.sh current_version
并且current_version包含:
1.2.2
我希望run.sh
下降到1.2.2并运行程序foo
。
当前的解决方案是这样的:
#!/bin/sh version = `cat current_version` cd $version ./foo
它可以工作,但不是很可靠。它不检查文件是否存在,不能处理多行,前导空格,注释行,空白文件等。
使用Shell或者Perl脚本执行此操作的最可行的方法是什么?
解决方案
回答
这是一种常见的方法。我们可以使用测试运算符检查目录/文件是否存在,例如" if [-d" somedirectory"]; then"或者[-t" somefile"]
不过,我更经常使用符号链接。然后,我们只需更改符号链接即可使用所需的版本。
例如,
$ ln -s 1.2.2 current_version $ ls -al total 20 drwxr-xr-x 5 dbreese dbreese 4096 2008-09-15 13:34 . drwxr-xr-x 3 dbreese dbreese 4096 2008-09-15 13:34 .. drwxr-xr-x 2 dbreese dbreese 4096 2008-09-15 13:34 1.2.1 drwxr-xr-x 2 dbreese dbreese 4096 2008-09-15 13:34 1.2.2 drwxr-xr-x 2 dbreese dbreese 4096 2008-09-15 13:34 1.3.0 lrwxrwxrwx 1 dbreese dbreese 6 2008-09-15 13:34 current_version -> 1.2.2/
然后,脚本可以只使用" cd current_version"。
回答
我将更改脚本以接受参数。参数应为文件名。使用我们喜欢的任何脚本语言[perl,python]打开文件,然后遍历文件,直到找到与版本匹配的文件。
我会使用正则表达式...类似于/\d.\d.\d/。然后让它通过脚本执行应用程序。
回答
我们可以使用&&和||检查是否存在。运营商:
!$/bin/sh version = `cat current_version` cd $version && ./foo || echo "Bad version"
&&运算符使第二条语句仅在第一个语句成功(退出状态为0)时执行,而||运算符仅在第一个语句失败(退出状态为非零)时才使第二条语句执行。
我不确定应付多行,前导空格或者注释行是什么意思。
回答
!#/bin/sh if [ -e 'current_version' ]; then version=`cat current_version`; version=`echo $version | tr -ds [[:blank:]]` if [ -n "$version" ]; then if [ -d "$version" ]; then cd "$version" else echo $version is not a directory fi else echo version_file contained only blanks fi else No file named current_version exists fi
回答
如果版本控制始终采用#。#。format格式,则可以执行以下操作:
ls | grep ^[0-9]\.[0-9]\.[0-9]$ | sort -nr | head -n 1
这将按降序列出版本,然后选择其中的第一个
回答
关于什么:
#!/usr/bin/perl -w use strict; use warnings; my $version_file = 'current_version'; open my $fh, '<', $version_file or die "Can't open $version_file: $!"; # Read version from file my $version = <$fh>; chomp $version; # Remove whitespace (and match version) die "Version format not recognized" if $version !~ m/(\d+\.\d+\.\d+)/; my $dir = ; die "Directory not found: $dir" unless -d $dir; # Execute program in versioned directory. chdir $dir; system("./foo");