Wie wird die Versionsnummer in einem Shell-Skript erhöht?

Die folgende einfache version control Skript ist gedacht, um die letzten Versionsnummer einer Datei Anhängen, führen einen bestimmten Befehl mit dem neu erstellten Datei (z.B. editor), und danach speichern Sie es auf stabil. Da ist es einfach, es nicht nichts überprüfen, da das script modifiziert werden, wie benötigt. Zum Beispiel, wenn das Ergebnis nicht stabil ist, kann der Benutzer weglassen, das Letzte argument.

Jedoch ein wichtiges Anliegen der aktuellen Funktionalität ist, wie die Umsetzung der folgenden Schritte: wenn der Letzte Abschnitt nach der dot hat zwei Ziffern, inc, bis 99; wenn nur 1, dann inc bis 9, dann bewegen Sie den vorherigen Abschnitt. Die Versionen kann eine beliebige positive Ganzzahl, Anzahl der Teilbreiten.

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

Das Verbleibende Problem ist, dass es nicht warten Sie, für eine tabbed-Wein-editor, um die Datei zu schließen; das Ziel ist, zu erkennen, wenn der tab geschlossen ist. Auch könnten Sie erklären, wie am besten, um sicherzustellen, dass meine Variablennamen nicht existierende überschreiben?

Bieten Sie auch andere Verbesserungen.

#!/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.

Update:
Das folgende funktioniert auf meinem pc, ich werde es aktualisieren, wenn Verbesserungen oder Lösungen für ungelöste Probleme gefunden werden:

#!/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.

Schätze ich die Vielfalt der Lösungen, die angeboten wurden, denn Sie helfen mit, gewinnt eine Perspektive und ziehen Sie einen Vergleich.

InformationsquelleAutor der Frage nnn | 2011-12-28

Schreibe einen Kommentar