Bash-Programmierung -frage

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Colttt
Beiträge: 3012
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Bash-Programmierung -frage

Beitrag von Colttt » 16.10.2008 23:44:42

Hallo leute,

ich bin neu hier, ich hoffe doch ich stell die frage hier so das ihr mir weiter helfen könnt. ;)

Ich möchte für BF2 ein kleines startskript erstellen, was zuerst prüft ob die IP-Adresse mit der serversettins.con(bei BF2) übereinstimmt und wenn nicht mich fragt ob ich sie entsprechen enfügen möchte und mir dann die ganzen karten anzeigt ich dann ne nr eintippe und er die entsprechende karte startet..

nen bissl hab ich schon so halbwegs hinbekommen, leider muss ich bei dieser methode alles manuel im skript eintragen:
hier schonmal mein bisheriges skript:

Code: Alles auswählen

#!/bin/bash
echo ""
echo "[1] Dalian Plant            [2] Daqing Oilfieds"
echo "[3] Dragon Valley	    [4] Fushe Pass"
echo "[5] Gulf of Oman            [6] Kubra Dam"
echo "[7] Mashtuur City           [8] Operation Clean Sweep"
echo "[9] Sharqi Peninsula        [10] SonghuaStalemate"
echo "[11] Strike at Karkand      [12] Zatar Wetlands"
echo ""
read eingabe #es muss eine eingabe getan werden

#es wird die aktuelle IP von eth0 ausgelesen
serverip=$(/sbin/ifconfig eth0 |grep 'inet ' | cut -d : -f2 | cut -d ' ' -f1)
#es wird die IP-Adresse in der BF2-Config ausgelesen
seting=$(cat /home/gameserver/bf2/1.0/mods/bf2/settings/serversettings.con |grep serverIP)
einmal=${seting#*'"'} #wird zum vergleich zurechtgestuzt wir brauchen nur die reine IP-Adresse
zweitens=${einmal%*'"'}

#jetzt wird erstmal die IP geprüft und wenn sie nicht übereinstimmt wird eine meldung ausgeben

if [ $zweitens != $serverip ]; then echo "Du hast deine IP-Adresse noch nicht in die serversettings.con eingeragen! Bitte hol dies nach damit der Server läuft!!" exit 0

 else
	if [ $eingabe = 1 ]; then echo "mapList.append dalian_plant gpm_cq 16" > mods/bf2/settings/maplist.con && sh start.sh
	elif [ $eingabe = 2 ]; then echo "mapList.append daqing_oilfields gpm_cq 16" > mods/bf2/settings/maplist.con && sh start.sh
	elif [ $eingabe = 3 ]; then echo "mapList.append dragon_valley gpm_cq 16" > mods/bf2/settings/maplist.con && sh start.sh
	elif [ $eingabe = 4 ]; then echo "mapList.append fushe_pass gpm_cq 16" > mods/bf2/settings/maplist.con && sh start.sh
	elif [ $eingabe = 5 ]; then echo "mapList.append gulf_of_oman gpm_cq 16" > mods/bf2/settings/maplist.con && sh start.sh
	elif [ $eingabe = 6 ]; then echo "mapList.append kubra_dam gpm_cq 16" > mods/bf2/settings/maplist.con && sh start.sh
	elif [ $eingabe = 7 ]; then echo "mapList.append mashtuur_city gpm_cq 16" > mods/bf2/settings/maplist.con && sh start.sh
	elif [ $eingabe = 8 ]; then echo "mapList.append operation_clean_sweep gpm_cq 16" > mods/bf2/settings/maplist.con && sh start.sh
	elif [ $eingabe = 9 ]; then echo "mapList.append sharqi_peninsula gpm_cq 16" > mods/bf2/settings/maplist.con && sh start.sh
	elif [ $eingabe = 10 ]; then echo "mapList.append songhua_stalemate gpm_cq 16" > mods/bf2/settings/maplist.con && sh start.sh
	elif [ $eingabe = 11 ]; then echo "mapList.append strike_at_karkand gpm_cq 16" > mods/bf2/settings/maplist.con && sh start.sh
	elif [ $eingabe = 12 ]; then echo "mapList.append zatar_wetlands gpm_cq 16" > mods/bf2/settings/maplist.con && sh start.sh
	else
	echo " "
	echo "Du hast leider nicht das richtige gedrückt.."
	fi
	

fi
exit 0
ich hoffe ihr wisst was ich meine.. schonmal vielen dank im voraus!! :D

evtl kann man auch irgendwie die ordnerstruktur einlesen und es dann mittels select-kommando machn?? habs versuch leider ohne erfolg :(
Debian-Nutzer :D

ZABBIX Certified Specialist

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash-Programmierung -frage

Beitrag von gms » 18.10.2008 22:29:12

Willkommen im Forum!

wenn ich dich richtig verstanden haben, dann meinst du das ca so:

Code: Alles auswählen

gms@gms1 ~/tmp/test $ cat x.sh
#!/bin/sh
SCRIPTDIR=$(dirname $0)

KARTEN=( $(cd "${SCRIPTDIR}/karten"; ls ) )
for ((i=0; $i<"${#KARTEN[*]}"; i++)); do
  printf "%2d %s\n" "$i" "${KARTEN[$i]}"
done

while read eingabe; do
  if [ -n "${KARTEN[$eingabe]}" ]; then
    break
  else
    echo "Du hast leider nicht das richtige gedrückt.."
  fi
done

echo "ausgewählt wurde: '${KARTEN[$eingabe]}'"
echo "mapList.append ${KARTEN[$eingabe]} gpm_cq 16" > mods/bf2/settings/maplist.con && sh start.sh


gms@gms1 ~/tmp/test $ ls
karten  x.sh
gms@gms1 ~/tmp/test $ ls karten
dalian_plant  daqing_oilfields
gms@gms1 ~/tmp/test $ ./x.sh
 0 dalian_plant
 1 daqing_oilfields
3
Du hast leider nicht das richtige gedrückt..
1
ausgewählt wurde: 'daqing_oilfields'
./x.sh: line 19: mods/bf2/settings/maplist.con: Datei oder Verzeichnis nicht gefunden
Gruß
gms

Colttt
Beiträge: 3012
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: Bash-Programmierung -frage

Beitrag von Colttt » 18.10.2008 23:46:13

geilo ich probier es morgen gleich mal aus.. nur leider bin ich noch nicht so gut bewandert darin könntest du das ein oder andere noch beschreiben??

vor allem:

Code: Alles auswählen

KARTEN=( $(cd "${SCRIPTDIR}/karten"; ls ) )
for ((i=0; $i<"${#KARTEN[*]}"; i++)); do
  printf "%2d %s\n" "$i" "${KARTEN[$i]}"
soviele "i"s und prozentzeichen.. :mrgreen:

und

Code: Alles auswählen

[ -n "${KARTEN[$eingabe]}" ]
schon mal vielen lieben dank!!

ähm warum hier zum schluss eine null?

Code: Alles auswählen

SCRIPTDIR=$(dirname $0)
Debian-Nutzer :D

ZABBIX Certified Specialist

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash-Programmierung -frage

Beitrag von gms » 19.10.2008 08:55:50

Code: Alles auswählen

SCRIPTDIR=$(dirname $0)
$0 ist eine vordefinierte Variable, die mit dem Pfad zu dem auszuführenden Script initialisiert wurde. Daher wird die Variable SCRIPTDIR hier auf das Verzeichnis gesetzt, indem dieses Script liegt. Diese Variable verwende ich anschließend um das Verzeichnis mit den Karten zu finden

Code: Alles auswählen

KARTEN=( $(cd "${SCRIPTDIR}/karten"; ls ) )
In der ersten Zeile wird hier also in das Karten-Verzeichnis gesprungen und ein "ls" ausgeführt. Dadurch wird das Array "KARTEN" mit der Ausgabe von "ls" initialisiert.
In meinem Fall entspricht das dann einem Array mit 2 Werten:

Code: Alles auswählen

KARTEN=( dalian_plant daqing_oilfields )

Code: Alles auswählen

for ((i=0; $i<"${#KARTEN[*]}"; i++)); do
  printf "%2d %s\n" "$i" "${KARTEN[$i]}"

Hier wird das Auswahlmenu angezeigt. "${#KARTEN[*]}" ist die Anzahl der Werte die in dem Array "KARTEN" enthalten sind, in dieser for-Schleife erhält die Variable "i" also die Werte zwischen 0 und der Anzahl der Werte in diesem Array, "${KARTEN[$i]}" ist der entsprechende Wert in diesem Array an der Position "$i"

Code: Alles auswählen

[ -n "${KARTEN[$eingabe]}" ]
"${KARTEN[$eingabe]}" ist auch der Wert in dem Array an der Position "$eingabe"
Mit [ -n "$Variable" ] würde überprüft werden, ob die Länge von "$Variable" länger als 0 ist, mit [ -n "${KARTEN[$eingabe]}" ] wird daher überprüft, ob die Variable "$eingabe" eine gültige Position in diesem Array hat.

Gruß
gms

Colttt
Beiträge: 3012
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: Bash-Programmierung -frage

Beitrag von Colttt » 20.10.2008 22:27:25

ohh man.. machst du das beruflich?! ist ja ganz schön kompliziert..
naja evtl bekomm ich das auch irgendwann mal so hin *lach*

aber vielen dank nochmal, es funktioniert auch super auch wenn neue karten dazu kommen :hail:
Debian-Nutzer :D

ZABBIX Certified Specialist

Antworten