我想使用一个文件存储一个客户软件的当前版本号,启动脚本可以使用它来在正确的目录中运行二进制文件。
例如,如果运行目录如下所示:
.
..
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脚本执行此操作的最可行方法是什么?
答案 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