Bash-Programmierung -Fragen- [Sammelthread]

Colttt

Enthusiast
Thread Starter
Mitglied seit
16.01.2006
Beiträge
2.667
Ort
Brandenburg(stadt)
Hallo ich hab mal ne kleine frage und zwar
was passiert hier bzw was wir da gemacht?!
wert="etc/init.d/rc"
var=${wert%%/*}
echo $var

also die erste und die letzte zeile ist mir klar nur die in der mitte leider nicht hat da wer ahnung?

schon mal vielen dank im voraus!!

Edit: ach käse wenn i schon was frage kann ich das andere ja auch noch fragen^^

ich möchte ein script erstellen womit ich den runlevel wechseln kann und ich möchte dabei auch dem runlevel parameter überreichen.. was muss ich dafür tun? (ist alles nur einfach zum rumprobieren) wo muss ich dann das skript ablegen damit ich es benutzen kann??

schon mal danke! :wink:
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
wenn ich mich noch richtig erinnere bekommst du mit * einfach eine Liste der übergebenen Argumente

und wofür ein Script?
welche Distri?
unter Debian/Ubuntu geht ein Runlevel-Wechsel einfach mit "init 2" (ohne "")
welche Runlevel welche Nummer haben musst du im Internet erst suchen
unter Ubuntu ist z.b. 2 der standardrunlevel

mfg
aelo
 
und wofür ein Script?
welche Distri?
unter Debian/Ubuntu geht ein Runlevel-Wechsel einfach mit "init 2" (ohne "")
welche Runlevel welche Nummer haben musst du im Internet erst suchen
unter Ubuntu ist z.b. 2 der standardrunlevel

mfg
aelo

naja script deswegen weil will lernen/probieren..
Distri: Lenny von KW32

und das ich nen runlevel mit init x wechseln kann weiss ich ;)


@maddin: thx aber raff es trotzdem leider noch nicht..
 
Es steht doch alles da:

${string%%substring}

Deletes longest match of $substring from back of $string.

Es wird also am Ende der Zeichenkette $string beginnend rückwärts nach der längsten Übereinstimmung von $substring gesucht. Falls $substring gefunden wird, werden die entsprechenden Zeichen entfernt.

Beispielskript:
Code:
...:/tmp# cat substr.sh 
#!/bin/bash

v="abcabc"

echo ${v%%c}
echo ${v%%b}
echo ${v%%a}
echo
echo ${v%%c*}
echo ${v%%b*}
echo ${v%%a*}

Ausgabe (mit Kommentaren):
Code:
...:/tmp# ./substr.sh 
abcab    # Treffer: abcab[c]
abcabc   # Kein Treffer
abcabc   # Kein Treffer

ab       # Treffer: ab[cabc]
a        # Treffer: a[bcabc]
         # Treffer: [abcabc]

Ich hoffe, damit ist es verständlicher geworden :)
 
ha ich glaub ich habs gescheckt..
also in meinem beispiel ists so das er guckt ob es das gibt und all das was es gibt, gibt er NICHT aus, richtig?!

schon mal dickes thx..

jetzt nur noch das script..
 
ich möchte ein script erstellen womit ich den runlevel wechseln kann und ich möchte dabei auch dem runlevel parameter überreichen.. was muss ich dafür tun? (ist alles nur einfach zum rumprobieren) wo muss ich dann das skript ablegen damit ich es benutzen kann??

schon mal danke! :wink:

Code:
#!/bin/bash

init $1

wäre die ultra kurzform, oder habe ich vor lauter müdigkeit die frage falsch verstanden?
ausführbar machen mit chmod u+x <scriptname> und dann mit ./scriptname anwerfen wenn im selben verzeichniss
 
wenn das die ultrakurzform ist dann hast du es richtig verstanden ;)

nur sollte es so sein das ich das programm aufrufe, er mich fragt welchen level ich haben möchte und dann eine meldung ausgeben soll das ich das gewünschte level jetzt habe oder auch nicht und es soll dabei ein programm gestarten werden.. mehr eigentlich nicht..

Code:
#!/bin/bash

echo "welchen runlevel willstn?"
read lvl                #dann den runlvl eintippen
init $lvl                #den lvl starten
/etc/init.d/möb start     #programm ausführen
echo "jup geschafft"

was ist daran jetzt alles falsch? und wie bau ich das mit "if" so ein das er fals es nicht klappt meckert?

schon mal vielen liebn dank an euch!! :wink:
 
Ich verstehe das ganze Vorhaben nicht. Wenn du schon ein Programm starten musst und Eingaben machen musst, dann kannste gleich deinen init Befehl in die Konsole hauen. Und wenn ein bestimmtes Programm zu einem jeweiligen runlevel gestartet werden soll kannst du gleich auf die /etc/init.d scripts zurückgreifen
 
das vorhaben ist einfach nur rumprobieren mit relativ simplen sachen.. wie ich es sonst machn kann ist mir schon klar.. aber i möchte es auch gerne ausprobieren.. ist nicht unbedingt sinn hinter aber egal..
 
so hab die oberen probleme gelöst.. ist ja garnicht soo schwierig..

mal ne andere frage.. wie kann ich perscript in einer datei den inhalt an bestimmter stelle ändern??
 
@madd!n: danke geht schon mal, will momentan leider nur nicht in meinem skript arbeiten, aber das bekomm ich auch noch hin..


So jetzt hab ich noch ne kleine frage ich will einen wegenmeiner /home/iche/'alle Ordner' möchte ich das er mir diese zur auswahl gibt und ich dann die netsprechende zahl eintippe und er dann etwas tut..

Bsp:
es sind im oben angegebenen verzeichnis 5 Ordner, er listet sie mir auf, ich tippe die "2" ein und dann öffnet er entsprechend den ordner

ich habs zwar schon hinbekommen mit den einzelnen ordner aber es ist leider recht statisch, das heisst wenn ich ein neuen ordner hinzufüge muss ich dies auch leider im skript tun..

hat jemand ne idee?? schonmal vielen dank im voraus!!
 
Bsp:
es sind im oben angegebenen verzeichnis 5 Ordner, er listet sie mir auf, ich tippe die "2" ein und dann öffnet er entsprechend den ordner

ich habs zwar schon hinbekommen mit den einzelnen ordner aber es ist leider recht statisch, das heisst wenn ich ein neuen ordner hinzufüge muss ich dies auch leider im skript tun..

hat jemand ne idee?? schonmal vielen dank im voraus!!

Ich hätte es so gemacht:
Auflisten einfach mit 'ls -la', und dann einfach sowas: cd `ls | sed -ne '2p'`, wobei die 2 für die zweite Zeile, also für den zweiten Ordner (oder dritten) steht. im Programm dann natürlich als die 2 als Variable.
 
Zuletzt bearbeitet:
dem program.. also "möb1" soll taste 1 sein, "möb2" taste 2 etc das soll er aber selber variabel machen und wenn i einen neuen ordner "bla" anlege dann soll er nach erneutem skriptstart das einbinden und ihm auch ne nummer zuweisen..

(ist alles für mein BF2-gameserver)
 
dem program.. also "möb1" soll taste 1 sein, "möb2" taste 2 etc das soll er aber selber variabel machen und wenn i einen neuen ordner "bla" anlege dann soll er nach erneutem skriptstart das einbinden und ihm auch ne nummer zuweisen..

(ist alles für mein BF2-gameserver)

Ich würde das Zeilenabhängig machen. Also ls -la gibt ja die Ordner Zeilenweise aus.
Dann haste beispielweise folgenes:

bla
bli
blu

wenn du 1 eingibst wird eben bla geöffnet, weil er in der ersten zeile steht. der Befehl dafür habe ich ja oben schon gepostet.
Du könntest es dann auch quasi gleich so ausgeben.

1 - bla
2 - bli
3 - blu

ist aber n bissl komplizierter, weil du halt bei ls -la immer nur eine Zeile ausgeben darfst, dann wieder die Zahl, dann die nächste Zeile von ls -la usw.
 
@Jean Pernod: geht leider nicht, allein wenn ich das in die bash hacke kommt da nichts raus sondern nur ">" und da kann ich dann was eintippen bis ich grün werde.. muss dann miit Strg+C rausgehn.
 
schreib mal deinen code hier rein damit man dir auch sagen kann wo der fehler liegt
 
ok also hier mal mein ganzer codekram, zuerst der ursprugscode:

Code:
#!/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.. DU ARSCH bist wohl zu blöd ne zahl zu drücken wa?!"
    fi
    

fi
exit 0

wie ihr seht geht das zwar aber sehr undynamisch und wenn da mal ne neue map hinzukommt muss ich viel neues eintragen..

so und dann wollte ich automatisch das er die IP-Adresse einfügt, geht leider auch nicht:
Code:
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 "Deine IP-Adresse wird eingetragen" & sed 's/sv.serverIP/sv.serverIP '$serverip'/' tada
fi 
exit 0

geht leider auch nicht so richtig.

und wenn ich das eintippe in die konsole:
Code:
cd `ls | sed -ne '2p'`
passiert nichts bzw kommt ne fehlermeldung "bash: cd: drwx-xr-x: datei oder Verzeichnis nicht gefunden"
mach ich was falsch oder hab ich noch zu viel blut im Alkohol^^??

schon mal vielen dank im voraus!!
 
Code:
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 "Deine IP-Adresse wird eingetragen" & sed 's/sv.serverIP/sv.serverIP '$serverip'/' tada
fi 
exit 0

geht leider auch nicht so richtig.

Es wäre super wenn du schreiben würdest was nicht geht, oder zumindest eine Ausgabe posten würdest. Denn bei solchen Sachen wie "sbin/ifconfig eth0" kommt halt u.U. was vollkommen anderes bei jedem raus.







und wenn ich das eintippe in die konsole:
Code:
cd `ls | sed -ne '2p'`
passiert nichts bzw kommt ne fehlermeldung "bash: cd: drwx-xr-x: datei oder Verzeichnis nicht gefunden"

wäre interessant was ls bei dir ausgibt...
 
Es wäre super wenn du schreiben würdest was nicht geht, oder zumindest eine Ausgabe posten würdest. Denn bei solchen Sachen wie "sbin/ifconfig eth0" kommt halt u.U. was vollkommen anderes bei jedem raus.

ich wollte das er die IP ausliest, guckt ob sie schon in der "serversettings.con" schon drin steht und wenn nein mich fragt ob er sie ersetzen soll und bei mir kommt das hier raus:
Code:
eth0      Link encap:Ethernet  Hardware Adresse 00:1e:ec:09:5c:4a  
          inet Adresse:192.168.1.111  Bcast:192.168.1.255  Maske:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metrik:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:19


wäre interessant was ls bei dir ausgibt...
Code:
insgesamt 56
drwxr-xr-x 14 stefan stefan 4096  8. Okt 13:42 .
drwxr-xr-x  6 stefan stefan 4096 15. Sep 20:47 ..
drwxr-xr-x  3 stefan stefan 4096 15. Sep 20:47 dalian_plant
drwxr-xr-x  3 stefan stefan 4096 15. Sep 20:47 daqing_oilfields
drwxr-xr-x  3 stefan stefan 4096 15. Sep 20:47 dragon_valley
drwxr-xr-x  3 stefan stefan 4096 15. Sep 20:47 fushe_pass
drwxr-xr-x  3 stefan stefan 4096 15. Sep 20:47 gulf_of_oman
drwxr-xr-x  3 stefan stefan 4096 15. Sep 20:47 kubra_dam
drwxr-xr-x  3 stefan stefan 4096 15. Sep 20:47 mashtuur_city
drwxr-xr-x  3 stefan stefan 4096 15. Sep 20:47 operation_clean_sweep
drwxr-xr-x  3 stefan stefan 4096 15. Sep 20:47 sharqi_peninsula
drwxr-xr-x  3 stefan stefan 4096 15. Sep 20:47 songhua_stalemate
drwxr-xr-x  3 stefan stefan 4096 15. Sep 20:47 strike_at_karkand
drwxr-xr-x  3 stefan stefan 4096 15. Sep 20:47 zatar_wetlands
und wenn da jetzt ne neue karte(ordner) reinkommt, möchte ich das er es mir angibt und mir auch dafür automatisch eine nummer zuweist die ich dann dadruch öffnen kann..
ich hoffe du weisst wie ich das meine.. wenn i C könnte würde ich es ja damit alles machn.. und dazu noch ne hübsch gui.. ^^
 
Das mit cd `ls | sed -ne '2p'` funzt nicht, weil du anscheinend einen alias dieser Form hast: ls='ls -l'.
Bei ls sollte er nur die Ordner auflisten, ohne den ganzen andeen quark.
Du kannst aber auch ein cd `ls | sed -ne '2p'` modifizieren. cd `ls | sed -ne '2p' | cut -d ' ' -f 9` sollte klappen.
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh