скрипт awk и bash - PullRequest
       18

скрипт awk и bash

0 голосов
/ 03 декабря 2009

У меня есть файл tgz, который содержит файл версии version.txt. Этот файл имеет только одну строку "версия = 1.0.0". Этот файл tgz находится в двух разных каталогах и имеет одно и то же имя.

Мое требование заключается в том, что мне нужно использовать скрипт bash и awk, чтобы определить, какой из этих двух файлов tgz имеет последнюю версию. т.е. файл tgz, имеющий 1.0.0, имеет более низкую версию, чем файл, имеющий версию 1.0.1.

Ответы [ 2 ]

1 голос
/ 03 декабря 2009

Извиняюсь за отрицание и отрицательный комментарий, но я всегда с подозрением отношусь к вопросам типа домашней работы Чтобы исправить это, я сделал это для вас. Вам не нужен awk, все это можно сделать в bash.

Просто установите F1 и F2 на правильные имена файлов. Я оставлю это в качестве упражнения для вас, чтобы принять их в качестве аргументов командной строки:)

#!/usr/bin/env bash
F1=f1.tgz
F2=f2.tgz
VERSION_FILE=version.txt
version1=`tar -xzf $F1 -O $VERSION_FILE|sed -e 's/.*version=//'`
version2=`tar -xzf $F2 -O $VERSION_FILE|sed -e 's/.*version=//'`

if [ "$version1" == "$version2" ]; then
    echo "$F1 and $F2 contain the same version: $version1, $version2"
    exit 0;
fi

(   # start a subshell because we're changing IFS

    # Assume F1 is the latest file unless we find otherwise below
    latest_file=$F1
    latest_version=$version1

    # set the Internal Field Separator to a dot so we can
    # split the version strings into arrays
    IFS=.

    # make arrays of the version strings
    v1parts=( $version1 )
    v2parts=( $version2 )

    # loop over $v1parts, comparing to $v2parts
    # NOTE: this assumes the version strings have the same
    # number of components. If wont work for 1.1 and 1.1.1,
    # You'd have to have 1.1.0 and 1.1.1
    # You could always add extra '0' components to the shorter array, but
    # life's too short...
    for ((i = 0 ; i < ${#v1parts[@]} ; i++ )); do
        # NOTE: ${#v1parts[@]} is the length of the v1parts array
        if [ "${v1parts[i]}" -lt "${v2parts[i]}" ]; then
            latest_file=$F2
            latest_version=$version2
            break;
        fi
    done
    echo "$latest_file is newer, version $latest_version"
)
1 голос
/ 03 декабря 2009

Используйте tar -xzvf /mnt/cf/bundle.tgz -O version.txt для извлечения версии.

Сложная часть - как работать с версией. Если ваша версия всегда состоит из трех цифр, то я предлагаю умножить каждую часть на 1000. Это даст вам большое число, которое вы можете легко сравнить. То есть 1.0.0 == 1000000000; 1.0.1 = 1000000001. Другой вариант - отформатировать каждую часть с% 04d: 0001.0000.0000 и 0001.0000.0001. Эти строки можно сравнить.

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