script um in vorhandende Datei zu schreiben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
timb
Beiträge: 47
Registriert: 06.10.2005 15:27:59

script um in vorhandende Datei zu schreiben

Beitrag von timb » 10.02.2006 12:44:48

Hallöle,


kann mir vorstellen das diese frage schon gestellt wurde, hab mit der suche aber auch nach ner halben stunde nich das richtige gefunden.

Also ich hab ein bash-script geschrieben mit dem ich ein Half-life server starte. Ausserdem hab ich Variablen ($1, $2 ...) eingefügt um beispielsweise bestimte maps/lvls mit einer bestimmten spieleranzahl zu starten.

Schön un gut klappt alles, fast schon zu einfach. (ich bin ein script-neuling, erst seit gestern :) )

Sooo jetzt gibt es aber Parameter die ich vorher in versch. conf datein festlegen muss.
Beispiel:
Um festzulegen wieviele CPU-Spieler/Bots in dem Spiel teilnehmen sollen, muss ich die datei bots.cfg öffnen un dort die anzahl der CPU-Spieler einzutragen.
Kann ich diesen vorgang auch scripten, sprich:
Script soll eine datei mit vi öffnen un dort einen bestimmten eintrag tätigen.

Oder falls dies nicht möglich ist, habe ich mir als notlösung überlegt, dass ich den inhalt der .cfg datei einfach in das script schreibe und dann kann ich ja variablen einsezten und das script soll dann diese datei erstellen und für die variablen werte einsezten.

Würde mich freuen wenn mir jmd. ein paar befehle auflistet mit denen ich das umsetzen könnte und ob das überhaupt möglich ist.

MfG

Tim Bleimehl
DU BIST DOCH KEIN PORTUGIESE!

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: script um in vorhandende Datei zu schreiben

Beitrag von roli » 10.02.2006 13:11:41

Hi,
timb hat geschrieben: Sooo jetzt gibt es aber Parameter die ich vorher in versch. conf datein festlegen muss.
Beispiel:
Um festzulegen wieviele CPU-Spieler/Bots in dem Spiel teilnehmen sollen, muss ich die datei bots.cfg öffnen un dort die anzahl der CPU-Spieler einzutragen.
Kann ich diesen vorgang auch scripten, sprich:
Script soll eine datei mit vi öffnen un dort einen bestimmten eintrag tätigen.
das muesste gehen, sogar ohne vi :wink:
Denn du mal ein Beispiel der Konfigdatei postest, und sagst was du gerne wie erstzen moechtest, dann ist dir zu helfen.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Re: script um in vorhandende Datei zu schreiben

Beitrag von meandtheshell » 10.02.2006 13:13:59

timb hat geschrieben: Um festzulegen wieviele CPU-Spieler/Bots in dem Spiel teilnehmen sollen, muss ich die datei bots.cfg öffnen un dort die anzahl der CPU-Spieler einzutragen.
im startscript diesen eintrag machen

Code: Alles auswählen

echo "number_of_players_etc." >> /path/to/file/<name_of_configfile>
das geht nat. auch mit vorher definierten variablen

Code: Alles auswählen

markusgattol@pc1:~/misc$ var=2
markusgattol@pc1:~/misc$ echo "$var" >> test/file1
markusgattol@pc1:~/misc$ cat test/file1
2

Um mehr sagen zu können musst du code posten.

markus

Benutzeravatar
timb
Beiträge: 47
Registriert: 06.10.2005 15:27:59

Beitrag von timb » 10.02.2006 13:52:37

**EDITED*** 10.02.06 16:18


Ok danke für die schnelle hilfe hier ein ma ein bisserl code un erläuterungen:

Code: Alles auswählen

.....170 Zeilen Bot-Konf.


#Hier folgt nun die stelle an der ich durch das einfügen von dem Befehl "addbot"
#genau ein Cpu-Spieler einfüge. In diesem falle wären es genau 3 Cpu-Spieler

addbot
addbot
addbot


# The line below binds the User Menu to the "=" key. Of course you
# can bind this to any key you like. 
bind "ß" "podbotmenu"
Leider habe ich inzwischen raugefunden, dass es nicht möglich ist einfach eine Zahl/variable zu nutzen wie z.b.

Code: Alles auswählen


3*addbot

oder halt

variable*addbot

was heißt ich muss ein script schreiben welches die datei einliest, auf Zeile 170 springt und dort Addbot einträgt, in die nächste Zeile springt und wieder addbot einträgt bis eine zählvariable abgelaufen is...also ne schleife..ok :) Diese zählvariable würde ich dann beim start des Server als Parameter mitgeben.

Ausserdem müsste ich dann ja bei einem neustart oder halt beenden des servers, die alten addbot-Commands wieder rauslöschen, dazu müsste der inprinzip alle "addbot"s in dem text suchen und deleten, müsste aber möglich sein, oder?

also ein paar tipps und befehle zum Thema Textbearbeitung per bashprogrammierung :) wärn nett.
Zuletzt geändert von timb am 10.02.2006 16:20:04, insgesamt 2-mal geändert.
DU BIST DOCH KEIN PORTUGIESE!

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 10.02.2006 15:23:40

@ hi timp
also gelesen hab ich den Text nicht - das kannst du keinem zumuten :wink:
Siehe meine Signatur: Code Tags, NoPaste

Info für dich:
http://www.linuxfibel.de/bash.htm

markus

Benutzeravatar
timb
Beiträge: 47
Registriert: 06.10.2005 15:27:59

Beitrag von timb » 10.02.2006 16:19:12

@ meandtheshell

hatte es verdammt eilig un hatte gedacht ich komme heut nach der arbeit net mehr heim :) hat sich jetzt aber erledigt
Jetzt habe ich es nochma ordentlich gemacht

Sry nochmal

Hab jetzt auch bei deinem Link nen paar nette hinweise gefunden THX
DU BIST DOCH KEIN PORTUGIESE!

Benutzeravatar
timb
Beiträge: 47
Registriert: 06.10.2005 15:27:59

Beitrag von timb » 10.02.2006 16:39:05

So dann fang ich ma an :) damit müsste es klappen hab ich von der Linuxfibel http://www.linuxfibel.de/bashprog.htm (ziemlich genau in der mitte der Seite unter "Dateien bearbeiten")

Code: Alles auswählen

#!/bin/sh
# Laden der "Bibliotheksdatei"
. filehandling.sh

# Datei einlesen
readfile zu_bearbeitende_Datei FeldVariable Anzahl

# Inhalt bearbeiten
for ((i=0; i<$Anzahl; i++)); do
  # Bearbeiten von FeldVariable[$i]...
done

# Datei schreiben
writefile FeldVariable Anzahl > zu_bearbeitende_Datei

Wenn ich das richtig verstanden habe, werde ich eine copy der cfg-datei machen und an der Addbot-Stelle eine Variable hinsetzen, das script liest die copy-boz.cfg per readfile ein findet die variable und setzt statt dieser addbot ein und schreibt per writefile die original bot.cfg datei.
Muss ich nur zeimlich viele funktionen machen blabla aber naja, fast alles im leben is viel arbeit :)

Wäre nett wenn mich jmnd. darauf hinweißt wenn ich ganz auf dem falschen weg bin :) ?? dann erspar ich mir arbeit :)

MfG

Tim
DU BIST DOCH KEIN PORTUGIESE!

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 10.02.2006 20:06:37

Hi,

nur noch mal zu meinem Verstaendnis, der String "addbot" muss ab Zeile 170 und folgende, so oft vorkommen, wie Spieler teilnehmen sollen/wollen, oder?
Wenn dem so ist, wuerde ich zuerst alle Zeilen die ausschliesslich "addbot" enthalten loeschen, um anschliessend die gewuenschte Anzahl einzufügen.
Dazu gibt es tausende Moeglichkeiten das zu machen, meine musst du also nicht als Referenz ansehen, wahrscheinlich sind auch die meisten besser eleganter oder was auch immer.
Auf jeden Fall solltest du eine Sicherheitskopie der Konfigurationsdatei anlegen!

Code: Alles auswählen

#!/bin/bash
konf_file="hier den Dateinamen mit Pfad einsatzen"

#Pruefern ob eine Anzahl der Spieler >0 uebergeben wurde
if [ "$1" -gt 0 ]
then
  anzahl=$1
else
  echo "Usage: $0 Anzahl_der_Spieler"
  exit 1
fi

# der nachfolgende sed Aufruf liest die Konfigurationsdatei ein,
# schmeisst Zeilen die Ausschliesslich addbot enthalten weg,
# und schreibt das Ergebnis nach konf_file.tmp
sed -e '/^addbot$'/d' <$konf_file >$konf_file.tmp

#Konfigfile loeschen, da wir ja jetzt die .tmp Datei haben, und dann leer anlegen
rm $konf_file.tmp
touch $konf_file

#Hilfsvariablen
z_zaehler=0 #Zeilenzaehler
tmp_anz=1   #Variable die ich hochzaehle bis zur anzahl der Spieler

#Einlesen der Konfiguration
while read zeile
do
  let z_zaehler=$z_zaehler+1

  #sind wir schon in Zeile 170?
  if [ "$z_zaehler" -eq 170 ]
  then
    #ja
    echo $zeile>>$konf_file
    #jetzt so oft addbot ausgeben wie dem Script übergeben wurde
    while [ "$tmp_anz" -le "$anzahl" ]
    do
      echo "addbot" >>$konf_file
      let tmp_anz=$tmp_anz+1
    done
  else
    #nein, Zeilen einfach so "rausschreiben"
    echo $zeile >>$konf_file
  fi
done <$konf_file.tmp
So, das ist jetzt UNGETESTET, sollte aber klappen. Du musst in der zweiten Zeile die Konfigurationsdatei eintragen, und das Script mit der Anzahl der Spieler als Parameter aufrufen. Vorher musst du's natuerlich ausfuehrbar machen (chmod 700 DATEI).
Wenn noch was unklar ist, einfach fragen.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
timb
Beiträge: 47
Registriert: 06.10.2005 15:27:59

wau

Beitrag von timb » 10.02.2006 21:29:17

so genau wollt ichs gar net wissen...ne spass :)

WAU 8O ... danke für den aufwand *yousavedmyday*

sieht für mich auf den ersten blick plausibel aus :) kann ich meine kümmerlichen versuche in die tonne hauen 8)

ich geh jetzt ersma feiern deshalb kann ich dat net mehr testen :)
werde aber direkt morgen früh meinen verkarterten Körper vor den rechner schwingen un dat austesten :)

nochmals vielen dank für die arbeit


Schönen Freitag Abend wünscht der Tim
DU BIST DOCH KEIN PORTUGIESE!

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 11.02.2006 10:56:58

Moin,

kein Thema, das mit dem Script. Wenn was nicht funktioniert, nicht klar ist, ... frag ruhig.
Ich habe auch oft genug Probleme und bin froh wenn mir einer hilft, nur muss man dafuer halt selber bereit sein zu helfen. Weil ich gestern Zeit hatte, habe ich mich dann mal dran gesetzt.
Einem dann ein nacktes, wahrscheinlich nicht boes gemeintes, RTFM an den Kopf zu schmeissen halte ich fuer sinnlos, damit ist keinem geholfen, und die Laune wird auch bei keinem Besser . Entweder man gibt konkrete Tips, Code, oder Link's (zum Manual), oder man spart sich den Spruch.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

jhr-online
Beiträge: 2186
Registriert: 18.09.2005 15:52:02
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Beitrag von jhr-online » 11.02.2006 11:25:15

roli hat geschrieben:Einem dann ein nacktes, wahrscheinlich nicht boes gemeintes, RTFM an den Kopf zu schmeissen halte ich fuer sinnlos, damit ist keinem geholfen, und die Laune wird auch bei keinem Besser . Entweder man gibt konkrete Tips, Code, oder Link's (zum Manual), oder man spart sich den Spruch.
Debianforum.de - Verhaltensregeln hat geschrieben:3.2. Angriff ist nicht immer die beste Verteidigung

Wenn jemandem die Fragestellung in einem Beitrag oder generell die Art und Weise wie andere schreiben nicht passt oder man keinerlei Information zur Lösung des Problems beitragen kann, so sollte man sich von diesen Themen am Besten fernhalten.
jhr
Desktop: Intel Core2Quad Q8300 2.5GHz, 256GB SSD + 1 TB HDD, 8 GB RAM, Debian Sid, Kernel 3.13

Benutzeravatar
timb
Beiträge: 47
Registriert: 06.10.2005 15:27:59

Beitrag von timb » 11.02.2006 19:25:34

JO danke roli hab das script jetzt fast angepasst funktioniert schon so gut wie ;) is ja echt keine sexy syntax dieser bash kram, naja aber gibt schlimmeres :)

@jhr-online
Sehr hilfreich!
DU BIST DOCH KEIN PORTUGIESE!

Benutzeravatar
timb
Beiträge: 47
Registriert: 06.10.2005 15:27:59

Beitrag von timb » 12.02.2006 19:24:36

also, irgendwie hab ich es nicht hinbekommen, es hat zwar fast geklappt aber ich bin aus der schleife net mehr rausgekommen, d.h. er hat nach dem er addbot unten hingeschrieben, wieder angefangen unter addbot die ganze cfg. datei nochmal einzulesen un kamm innne endlosschleife. hab dann hier un da mal rummodifiziert un es kamm nie ein zufriedenstellndes ergebnis raus.
jetzt bin ich ganz feige auf heimatterrain abgehaun un habs in c++ geschrieben ;)

Code: Alles auswählen

#include <stdio.h>

int main(int argc, char*argv[])
{
	#deklarierung der Variablen
	char *path="/usr/local/halflife/hlds_l/cstrike/addons/podbot/copypodbot.cfg";
	FILE *fp;
	int team, bots, i;
	
	#Prüfe anzahl der übergebenen Parameter
	if (argc<3)
	{
		printf("falsche parameter anzahl \n");
		exit(0);
	}
	
	#einlesen der Parameter
	sscanf(argv[1], "%d", &bots);
	sscanf(argv[2], "%d", &team);
	printf("%d %d \n" ,bots,team);
	
	#öffnen der datei und mit a+ sagen: ans ende der datei schreiben
	fp=fopen (path, "a+");
	

	#addbot an die datei anhängen, so oft wie parameter "bots" groß ist
	for (i=0; i<bots; i++) 
		fprintf(fp, "addbot 101 5 %d 5 \n",team);
	
	fclose(fp);
	
return 0;

}
so un um das progrämche nun in ein simples shell script gepackt.

Code: Alles auswählen

#!/bin/bash





cd /usr/local/halflife/hlds_l/

cp ./cstrike/addons/podbot/copypodbot.cfg ./cstrike/addons/podbot/podbot.cfg
hlmod $3 $4
./hlds_run -game cstrike -insecure -nomaster +sv_lan 1 +maxplayers $1 +map $2

so nun kann ich den gameserver starten:
namedesscripts $1(maximale spieler anzahl) $2(name der zu spielenden karte) $3(anzahl der computergegner) $4(für welches team sollen die cpu-spieler kämpfen)

also beispiel:
hl 16 de_dust 5 2
karte de_dust 16, spieler dürfen teilnehmen, 5 cpu-spieler werden mitmachen die in das 2. team gehen.


Was hab ich daraus gelernt...ich mag die syntax von der bash net ;)

Trotzdem dank an alle, vorrallem an roli

MfG

Tim
DU BIST DOCH KEIN PORTUGIESE!

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 12.02.2006 21:07:59

Hi Tim,

so schnell geb ich jetzt auch nicht auf, mach's mal was genauer.
timb hat geschrieben: aber ich bin aus der schleife net mehr rausgekommen, d.h. er hat nach dem er addbot unten hingeschrieben, wieder angefangen unter addbot die ganze cfg. datei nochmal einzulesen un kamm innne endlosschleife.
Hat das Script addbot so oft eingetragen wie es sollte, und dann wieder in Zeile 1 der Konfiguration angefangen, oder wie muss ich das verstehen?
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
timb
Beiträge: 47
Registriert: 06.10.2005 15:27:59

Beitrag von timb » 13.02.2006 00:12:36

jope genau, kann dir ja morgen ma nen ausführlichen Bericht schreiben, was ich modifiziert hatte und was dann besser wurde bzw. sich nicht geändert hatte, un was für fehler genau aufgetreten sind. jetzt is mir aber zu spät :)

gude nacht bis moin
DU BIST DOCH KEIN PORTUGIESE!

Antworten