Как увеличить номер версии в сценарии оболочки?

Следующий простой скрипт управления версиями предназначен для поиска номера последней версии данного файла file, увеличьте его, запустите заданную команду с вновь созданным файлом (например, редактором), а затем сохраните его в стабильном. Поскольку это просто, он ничего не проверяет, поскольку сценарий может быть изменен по мере необходимости. Например, если результат не будет стабильным, пользователь может опустить последний аргумент.

Однако одна из основных проблем текущей функциональности заключается в том, как реализовать следующее: если последний раздел после точки имеет две цифры, inc до 99; если только 1, то прибавка до 9, затем переход к предыдущему разделу. Версии могут иметь любое положительное целое число разделов.

1.2.3.44 -> 1.2.3.45
1.2.3.9 -> 1.2.4.0
1.2.3 -> 1.2.4
9 -> 10

Остается проблема в том, что он не ждет, пока редактор Wine с вкладками закроет файл; цель - определить, когда вкладка закрыта.Кроме того, не могли бы вы объяснить, как лучше всего убедиться, что имена моих переменных не перезаписывают существующие?

Вы также можете предложить другие улучшения.

#!/bin/bash
#Tested on bash 4.1.5
#All arguments in order: "folder with file" "file pattern" cmd [stable name]
folder="$1"
file_pattern="$2"
cmd="$3"
stable="$4"

cd "$folder"
last_version=$(ls --format=single-column --almost-all | \
    grep "$file_pattern" | \
    sed -nr 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p' | \
    sort -Vu | \
    tail -n 1)
last_version_file=$(ls --format=single-column --almost-all | \
    grep "$file_pattern" | \
    grep $last_version | \
    tail -n 1) #tail -n 1 is only needed to get 1 line if there are backup files with the same version number
new_version=$(echo $last_version | \
    gawk -F"." '{$NF+=1}{print $0RT}' OFS="." ORS="") #increments last section indefinitely
new_version_file=$(echo "$last_version_file" | \
    sed -r "s/$last_version/$new_version/")
cp "$last_version_file" "$new_version_file"
"$cmd" "$new_version_file" & \
    wait #works with gedit but not with wine tabbed editor
[[ "$stable" ]] && \
    cp "$new_version_file" "$stable" #True if the length of string is non-zero.

Обновление: Следующие работы на моем компьютере, я обновлю их, если будут обнаружены улучшения или решения нерешенных проблем:

#!/bin/bash
inc()
{
shopt -s extglob
    num=${last_version//./}
    let num++

    re=${last_version//./)(}
    re=${re//[0-9]/.}')'
    re=${re#*)}

    count=${last_version//[0-9]/}
    count=$(wc -c<<<$count)
    out=''
    for ((i=count-1;i>0;i--)) ; do
        out='.\\'$i$out
    done

    sed -r s/$re$/$out/ <<<$num
}

folder="$1"
file_pattern="$2"
cmd="$3"
stable="$4"

cd "$folder"
last_version=$(ls --format=single-column --almost-all | \
    grep "$file_pattern" | \
    sed -nr 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p' | \
    sort -Vu | \
    tail -n 1) #--almost-all do not list implied . and ..
last_version_file=$(ls --format=single-column --almost-all | \
    grep "$file_pattern" | \
    grep $last_version | \
    tail -n 1) #tail -n 1 is only needed to get 1 line if there are backup files with the same version number
new_version=$(inc)
new_version_file=$(echo "$last_version_file" | \
    sed -r "s/$last_version/$new_version/")
cp "$last_version_file" "$new_version_file"
"$cmd" "$new_version_file" && \
    wait #works with gedit but not tabbed wine editor
[[ "$stable" ]] && \
    cp "$new_version_file" "$stable" #True if the length of string is non-zero.

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

26
задан Cybot 21 September 2015 в 13:14
поделиться