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
Du musst angemeldet sein, um einen Kommentar abzugeben.
UPDATE:
InformationsquelleAutor der Antwort kev
Hier sind ein paar mehr flexible Optionen. Beide akzeptieren einen zweiten argument anzugeben, die position zu erhöhen.
1. Einfache Funktion
Für mehr vorhersehbar Eingang.
2. Robust-Funktion
Für die Verwendung mit Skripts oder mehr Anpassungsmöglichkeiten, um für verschiedene versioning-Systeme. Es könnte ein paar mehr Optionen, aber wie es jetzt steht, funktioniert es für meine Projekte mit der "großen.minor[.Wartung[.build]]" version Sequenzen.
Natürlich, das ist übertrieben, nur um ein Inkrement version string. Aber ich schrieb dieses, weil ich hatte eine Notwendigkeit für verschiedene Arten von Projekten, und weil, wenn die Geschwindigkeit ist nicht ein Problem, ich bevorzuge die Wiederverwendbarkeit über das optimieren der gleiche code, der über Dutzende von scripts. Ich denke, das ist nur meine Objekt-orientierte Seite undicht zu meinen Skripten.
InformationsquelleAutor der Antwort Stephen M. Harris
Hier eine noch kürzere version, die unterstützt auch eine postfix (schön für -SNAPSHOT)
Erklärung
Ich verwendet regex erfassen 3 Teile. Die Sachen, die vor der letzten position, um die Anzahl zu erhöhen, und die Sachen nach.
((\d+\.)*)
- Material, das aus 1.1.1.1.1.(\d+)
- die Letzte Ziffer(.*)
- die Sachen nach der letzten ZifferDann benutze ich die e-option zu ermöglichen Ausdrücken im ersetzen-Teil. Hinweis: mit der-e option die mit \1 wird der Variablen $1, und Sie müssen, verketten Sie können Variablen mit dem Punktoperator.
$1
- die capture-Gruppe 1.1.1.1.1.($3+1)
- erhöhen Sie die Letzte Ziffer. Hinweis $2 ist auf der sub-Gruppe von 1 $zu bekommen, die wiederholt 1.$4
- die Sachen nach der letzten ZifferInformationsquelleAutor der Antwort Pyrolistical
Reinen Bash:
Ergebnis:
Versions-string splitten und im array gespeichert Teil.
Die Schleife geht vom letzten zum ersten Teil der version.
Der Letzte Teil erhöht werden und möglicherweise abgeholzt, um seine
original-Länge. Ein carry ist der nächste Teil.
InformationsquelleAutor der Antwort Fritz G. Mehner
Bestimmung eine Versionsnummer für ein software-Projekt basiert auf der relativen änderung /Funktionalität /Entwicklung /überarbeitung. Konsequenten Schritten die version und revision Nummerierung ist im Idealfall ein Prozess, der getan werden sollte, von einem Menschen. Allerdings nicht zu zweit-schätzen Sie Ihre motivation zum schreiben dieses Skripts, hier ist mein Vorschlag.
Einige Logik in Ihren Skripts, die genau das tun, was Sie beschreiben Ihre Anforderung
"...wenn der Letzte Abschnitt nach der dot hat zwei Ziffern, inc, bis 99; wenn nur 1, dann inc bis 9 ... "
Vorausgesetzt, die Dritte position ist die Entwicklungsstufe Anzahl
$dNum
und die vierte (Letzte) position ist die Revisionsnummer$rNum
:Vielleicht eine Funktion erlauben die prägnante Art der Handhabung aller Positionen (majNum.minNum.dNum.rNum).
Haben Sie zu trennen, den Namen des Projekts und die Bestandteile der Versionsnummer von Ihr mit dem Namen in Ihrem Skript, und dann konstruieren Sie die Versionsnummer mit all seinen Positionen, und schließlich rekonstruieren die Dateinamen mit so etwas wie
Hoffe, dass hilft und lassen in dieser Diskussion SO sowie dieser wikipedia-Eintrag wenn Sie mehr darüber wissen möchten, Versionsverwaltung Konventionen.
InformationsquelleAutor der Antwort venzen
Müde von der bash? Warum nicht versuchen, Perl?
Nicht ganz in übereinstimmung mit der Anforderung, natürlich.
InformationsquelleAutor der Antwort Sorpigal
Einfach mit bash, wc und sed:
InformationsquelleAutor der Antwort choroba