2008-09-15 79 views
1

我想使用一個文件來存儲一個客戶軟件的當前版本號,啓動腳本可以使用它來在正確的目錄中運行二進制文件。從文件中提取版本字符串的最佳方法是什麼?

例如,如果運行目錄如下:

. 
.. 
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腳本執行此操作最具生存力的方法?

回答

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」。

+0

我想避免因爲鏈接我不想破壞可能反對改變其工作目錄的程序的現有實例。 – Frosty 2008-09-15 20:32:16

0

我會改變腳本接受一個參數。參數應該是一個文件名。使用任何您喜歡的腳本語言[perl,python]打開文件並遍歷文件,直到找到與您的版本匹配的文件。

我會使用一個正則表達式...沿/\d\.\d\.\d/線的東西。然後讓它通過腳本執行應用程序。

+0

一個好的解決方案,但不能保證版本將保持x.x.x.次要數字可能會增加到9,產生類似1.2.12的東西,這會失敗。 – Frosty 2008-09-15 20:31:05

+0

@Frosty 也許/\d+\.\d+\.\d+/會用於這種情況? – 2008-09-15 23:41:15

0

可以使用& &,檢查是否存在||運算符:

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

的& &操作者使第二條語句,如果第一個成功(退出狀態0)僅執行,而||運算符只有在第一個語句失敗時纔會執行第二個語句(退出狀態非零)。

我不知道你用多行應對,前導空格或註釋行的意思。

+0

我想優雅地處理稍微'不正確'的版本文件。如果該文件有兩行,一個前導空格,一個尾隨空格或類似的原始解決方案將失敗。 – Frosty 2008-09-15 20:33:35

-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 
+0

除非有一個名爲$ version的目錄,否則這將失敗。 '$ version'將總是返回字符串$ version並且永遠不會展開該變量。改爲使用雙引號:「$ version」。 – 2008-09-15 23:39:27

0

如果版本控制總是在#。#中。#格式,你可以這樣做:

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

,將列出按數字順序降序版本,然後選擇其中的第一項

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"); 
相關問題