Каков наилучший способ извлечь строку версии из файла? - PullRequest
1 голос
/ 15 сентября 2008

Я хочу использовать файл для хранения текущего номера версии для части клиентского программного обеспечения, которая может быть использована скриптом запуска для запуска двоичного файла в правильном каталоге.

Например, если каталог запуска выглядит так:

.
..
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

Это работает, но не очень надежно. Он не проверяет существование файла, не может работать с несколькими строками, начальными пробелами, закомментированными строками, пустыми файлами и т. Д.

Каков наиболее приемлемый способ сделать это с помощью сценария оболочки или perl?

Ответы [ 6 ]

5 голосов
/ 15 сентября 2008

Это общий подход. Вы можете проверить существование dir / файла, используя тестовые операторы, такие как "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".

0 голосов
/ 16 сентября 2008

А как же:

#!/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");
0 голосов
/ 15 сентября 2008

Если версия всегда будет в формате #. #. #, Вы можете сделать это:

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

В этом списке будут перечислены версии в порядке убывания, а затем выбрана первая из них

0 голосов
/ 15 сентября 2008
!#/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 голосов
/ 15 сентября 2008

Вы можете проверить существование, используя && и || Операторы:

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

Оператор && заставляет второй оператор выполняться только в том случае, если первый оператор завершается успешно (состояние выхода 0), а || оператор вызывает выполнение второго оператора только в случае сбоя первого (состояние выхода ненулевое).

Я не уверен, что вы имеете в виду, имея дело с несколькими строками, пробелами или закомментированными строками.

0 голосов
/ 15 сентября 2008

Я бы изменил скрипт, чтобы принять аргумент. Аргумент должен быть именем файла. Откройте файл, используя любой язык сценариев, который вы предпочитаете [perl, python], и перебирайте файл, пока не найдете подходящую версию.

Я бы использовал регулярное выражение ... что-то вроде /\d\.\d\.\d/. затем запустите приложение через ваш скрипт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...