从文件中提取版本字符串的最佳方法是什么?
我想使用一个文件来存储一个客户软件的当前版本号,启动脚本可以使用它来在正确的目录中运行二进制文件。从文件中提取版本字符串的最佳方法是什么?
例如,如果运行目录如下:
.
..
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“];然后”或[-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/线的东西。然后让它通过脚本执行应用程序。
一个好的解决方案,但不能保证版本将保持x.x.x.次要数字可能会增加到9,产生类似1.2.12的东西,这会失败。 – Frosty 2008-09-15 20:31:05
@Frosty 也许/\d+\.\d+\.\d+/会用于这种情况? – 2008-09-15 23:41:15
可以使用& &,检查是否存在||运算符:
!$/bin/sh version = `cat current_version` cd $version && ./foo || echo "Bad version"
的& &操作者使第二条语句,如果第一个成功(退出状态0)仅执行,而||运算符只有在第一个语句失败时才会执行第二个语句(退出状态非零)。
我不知道你用多行应对,前导空格或注释行的意思。
我想优雅地处理稍微'不正确'的版本文件。如果该文件有两行,一个前导空格,一个尾随空格或类似的原始解决方案将失败。 – Frosty 2008-09-15 20:33:35
!#/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
除非有一个名为$ version的目录,否则这将失败。 '$ version'将总是返回字符串$ version并且永远不会展开该变量。改为使用双引号:“$ version”。 – 2008-09-15 23:39:27
如果版本控制总是在#。#中。#格式,你可以这样做:
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 = $1;
die "Directory not found: $dir" unless -d $dir;
# Execute program in versioned directory.
chdir $dir;
system("./foo");
我想避免因为链接我不想破坏可能反对改变其工作目录的程序的现有实例。 – Frosty 2008-09-15 20:32:16