PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Linux-Bash] Inkrementieren einer C-Konstanten


WhiteMike
25.09.2009, 23:19
Hallo, Leute! :)

Nachdem die Suchfunktion nichts brauchbares ergeben hat, muss ich wohl eine neue Frage aufwerfen, die sich um den Bash-Skript dreht. In diesem Bereich bin ich ein ziemlicher Neuling und würde mich wirklich freuen, wenn mir jemand mit dem nötigen Wissen versorgen würde.

Kernpunkt ist die Modifikation einer C-Konstanten in einer H-Datei durch den Skript und stellt im Grunde die Portierung von einer Windows-Variante, die gencha auf seinem Blog vorstellt ( und für die ich mich bei ihm auch herzlich bedanken möchte ).
Nun möchte ich die gleiche Technik allerdings auch auf meinem Linux-System benutzen. Das Öffnen der Datei sowie das Schreiben in diese Datei stellt überhaupt kein Problem dar. Woran es scheitert, ist das Einlesen des Wertes.

Man stelle sich vor, dass sich in der H-Datei die einfache Zeile
#define BUILD "42"
oder
const int BUILD = 42;
befindet und man sich durch den Aufruf des Skriptes das Inkrementieren der Konstante verspricht.

Auch das Speichern der aktuellen Zeit sowie Datums stellt keine Probleme dar.
Bei Wunsch kann ich den fertigen Skript anschließend hier reinstellen, damit jeder davon profitieren kann.

Ansonsten hoffe ich auf Eure Unterstützung und bedanke mich im Voraus.


mnemonic
25.09.2009, 23:23
Ich bin nicht so der Skripting-Guy, aber ich schätze mal, dass sed und awk dazu prädestiniert wären.

PERL natürlich auch.

Jan Krüger
25.09.2009, 23:27
Wahrscheinlich geht das in awk ganz einfach, aber ich hab keine Ahnung von awk. Stattdessen schlage ich vor, die Datei mit read zeilenweise auszulesen, den entsprechenden Teil irgendwie mit grep zu finden, mit cut auseinanderzustückeln, mit ((arithmetik)) dran rumzurechnen und wieder zusammenzusetzen. Aber das macht natürlich nicht besonders viel Spaß.

DerHartmut
25.09.2009, 23:28
Ich stand vor einem ähnlichem Problem und hab's in Perl wie folgt gelöst:

!WARNUNG: Folgendes Konzept zeugt von Faulheit!

Für ein Buildnummer-System:
- Eine Datei, in der NUR der auszulesende Wert steht
- Die Headerdatei

1. Auslesen des Wertes
2. Inkrementieren des Wertes
3. Einen String in Form von #DEFINE BUILD $zahl bauen
4. In die Headerdatei schreiben

Wie du siehst, viel zu umständlich ^^

Aber ein regulärer Ausdruck bzw. grep dürften deine Freunde sein.

WhiteMike
26.09.2009, 01:24
Vielen Dank Euch allen für die Hilfestellungen.

Ich habe erstmal den ersten Prototyp des Skriptes fertiggestellt.
Als Anfänger im Linux-Skripting habe ich vielleicht einiges nicht am besten gelöst, aber wenigstens bietet es schon mal die Grundfunktionalität.
Falls jemand weitere Vorschläge hat, sind sie immer gerne willkommen.

Hier ist der Skript, falls jemand irgendwann mal vor dem gleichen Problem steht:

#!/bin/bash

VERSION_FILE="version.h"
DATETIME=$( exec date )
BUILD="-1"



#######################################################################################################################
### main script
#######################################################################################################################


# check if the file is available
if [ ! -f $VERSION_FILE ]; then
echo "$VERSION_FILE does not exist"
exit -1
elif [ ! -r $VERSION_FILE ]; then
echo "$VERSION_FILE: can not read"
exit -2
elif [ ! -w $VERSION_FILE ]; then
echo "$VERSION_FILE: can not write"
exit -3
fi

# open file
exec 3<> $VERSION_FILE


# get data from file
while read line
do
# if the build value was found - increment this value
if [ "" != "$(echo $line | grep "BUILD" | cut -d" " -f"5")" ]; then
BUILD=$(echo $line | grep "BUILD" | cut -d" " -f"5")
((BUILD++))
fi
done < $VERSION_FILE

# clear file
echo "" > $VERSION_FILE

# add the new build value
echo -n "const int BUILD = " >&3
echo -n $BUILD >&3
echo " ;" >&3

# add date and time
echo -n "const char* const DATETIME = " >&3
echo -n $DATETIME >&3
echo " ;" >&3

# close file
exec 3>&-

exit 0

DerHartmut
10.12.2009, 08:41
Tipp: Das Einpflegen des Datums brauchste nicht via Script machen, probier mal __TIME__ und __DATE__ im C-Code. Das sind beides Makros für das Datum bzw. die Zeit, welche beim Kompilliervorgang ermittelt wird (in Form von Strings). Somit gibt bspw.

printf("%s, %s", __TIME__, __DATE__);

Zeit und Datum aus ;-)

Und "const char* const DATETIME"? Das zweite Const sieht ungesund aus ;-)

WhiteMike
10.12.2009, 17:22
Tipp: Das Einpflegen des Datums brauchste nicht via Script machen, probier mal __TIME__ und __DATE__ im C-Code. Das sind beides Makros für das Datum bzw. die Zeit, welche beim Kompilliervorgang ermittelt wird (in Form von Strings). Somit gibt bspw.

printf("%s, %s", __TIME__, __DATE__);

Zeit und Datum aus ;-)

Und "const char* const DATETIME"? Das zweite Const sieht ungesund aus ;-)




Danke für den Tipp, aber ehrlich gesagt war es auch damals schon kein Problem mit der Zeit und dem Datum. Wenn ich mich nicht irre, ist die Zeitangabe per Skript ausführlicher.


Warum sollte eigentlich das zweite const ungesund sein?