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

时间:2008-09-15 19:31:52

标签: perl bash scripting

我想使用一个文件存储一个客户软件的当前版本号,启动脚本可以使用它来在正确的目录中运行二进制文件。

例如,如果运行目录如下所示:

.
..
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脚本执行此操作的最可行方法是什么?

6 个答案:

答案 0 :(得分:5)

这是一种常见的方法。您可以使用测试运算符检查目录/文件是否存在,例如“if [-d”somedirectory“];然后”或[-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”。

答案 1 :(得分:0)

我会更改脚本以接受参数。参数应该是文件名。使用您喜欢的任何脚本语言[perl,python]打开文件并遍历文件,直到找到适合您版本的匹配项。

我会使用正则表达式... /\\\\\\\\\\ /。然后让它通过你的脚本执行应用程序。

答案 2 :(得分:0)

您可以使用&&amp ;;来检查是否存在和||操作符:

!$/bin/sh
version = `cat current_version`
cd $version && ./foo || echo "Bad version"

&&运算符导致第二个语句仅在第一个语句成功(退出状态0)和||时执行operator仅在第一个语句失败时退出(退出状态为非零)。

通过处理多行,前导空格或注释行,我不确定你的意思。

答案 3 :(得分:0)

如果版本控制始终采用#。#。#format,则可以执行此操作:

ls | grep ^[0-9]\.[0-9]\.[0-9]$ | sort -nr | head -n 1

那将按照数字降序列出版本,然后选择第一个

答案 4 :(得分:0)

怎么样:

#!/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 = $1;
die "Directory not found: $dir" unless -d $dir;

# Execute program in versioned directory.
chdir $dir;
system("./foo");

答案 5 :(得分:-4)

!#/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
相关问题