从文件中提取版本字符串的最佳方法是什么?

时间: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");