• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Configs für Shell Scripte

Snycs

Newbie
Hallo ich habe eine Frage. Ich arbeite derzeit an einem Script, mit dem ich verschiedene Minecraftserver ansteuern kann. Aktuell muss ich für jeden Server eine eigene Funktion anlegen.
Ich möchte aber eine Config File erstellen die Ungefähr so aufgebaut ist:
Code:
    server1:
         VERZECHNIS                          
         BESCHREIBUNG
    server2:
         VERZECHNIS                          
         BESCHREIBUNG
    server3:
         VERZECHNIS                          
         BESCHREIBUNG
    ...

Wie kann ich nun die Informationen aus der Config File auslesen und in das Script einbinden? Aktuell sieht das ganze so aus:

Code:
    #!/bin/bash
     
    BACKTITLE="Servermanager by Snycs"
    INPUT=/tmp/menu.sh.$$
    OUTPUT=/tmp/output.sh.$$
    trap "rm $OUTPUT; rm $INPUT; exit" SIGHUP SIGINT SIGTERM
    AKAMIE=/home/mc/
    LOGFILE=/home/mc/Logs/Syslog_$(date +%d.%m.%Y).log
    DATE=$(date +%d.%m.%Y_%H:%M:%S_Uhr)
    DAY=$(date +%d.%m.%Y)
     
    ############################################################################################################
    function fortschritt() {
    {	for I in $(seq 1 100) ; do
    		echo $I
    		sleep 0.01
    	done
    	echo 100; } | dialog --backtitle "[ F O R T S C H R I T T ]" \ --gauge "Fortschritt" 6 60 0
    }
    ############################################################################################################
    function server() {
    	dialog 	--clear	--backtitle "$BACKTITLE" \ --title "[ S E R V E R A U S W A H L ]" \ --menu "Die Server können mit den Pfeiltasten ausgewählt werden.\n\Bitte einen Server auswählen!" 15 50 7 \
     
    		Testserver "" \
    		Verlassen "Schliesst den Servermanager" 2>"${INPUT}"
     
    	MENUITEM=$(<"${INPUT}")
     
    	case $MENUITEM in
    		Testserver) testserver;;
    		Verlassen) echo "Bye"; break;;
    	esac
    }
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    function testserver() {
    	DIR=testserver
    	dialog --clear --backtitle "$BACKTITLE" \ --title "[ T E S T S E R V E R ]" \ --menu "Die Aktionen können mit den Pfeiltasten ausgewählt werden.\n\Bitte einen Server auswählen!" 15 50 4 \
     
    		Starten "Startet den Server." \
    		Stoppen "Stoppt den Server." \
    		Restart "Startet den Server neu." \
    		Status "Zeigt den Serverstatus an." \
    		Konsole "Geht in die Kosole" \
    		Edit "Den Server bearbeiten" \
    		Test "Das ist ein Testeintrag" \
    		Verlassen "Schliesst den Servermanager" 2>"${INPUT}"
    	
    MENUITEM=$(<"${INPUT}")
     
    case $MENUITEM in
    	Starten) start;;
    	Stoppen) stop;;
    	Restart) restart;;
    	Status) status;;
    	Konsole) console;;
    	Edit) edit;;
        	Test) test;;
    	Verlassen) echo "Bye"; break;;
    esac
    }
    #-----------------------------------------------------------------------------------------------------------
    ############################################################################################################
    function start() {
            if screen -list | grep -q "$DIR"; then
    			fortschritt
    			dialog --title '[ F E H L E R ]' --msgbox 'Der Server ist bereits gestartet!' 5 40
    		else
    			fortschritt
    			dialog --title '[ E R F O L G R E I C H ]' --msgbox 'Der Server wurde gestartet!' 5 50
                            cd $AKAMIE/$DIR/
            		bash start.sh
    		fi
    }
    function stop() {
            if screen -list | grep -q "$DIR"; then
    			fortschritt
    			screen -S $DIR -X quit
    			if screen -list | grep -q "$DIR"; then
    				dialog --title '[ F E H L E R ]' --msgbox 'Der Server wurde nicht gestoppt!' 5 50
    			else
    				dialog --title '[ E R F O L G R E I C H ]' --msgbox 'Der Server wurde erfolgreich gestoppt!' 5 50
    			fi
    	else
    			dialog --title '[ F E H L E R ]' --msgbox 'Der Server ist nicht gestartet!' 5 50
    	fi
    }
     
    function restart() {
            screen -S $DIR -X quit
            fortschritt
            cd $AKAMIE/$DIR/
            bash start.sh
    }
    function console() {
            screen -r $DIR
    }
    function edit () {
    	cd $AKAMIE/$DIR/
    	mc
    }
    function status () {
    	if screen -list | grep -q "$DIR"; then
    		dialog --title '[ S T A T U S ]' --msgbox 'Der Server ist gestartet!' 5 50
    	else
    		dialog --title '[ S T A T U S ]' --msgbox 'Der Server ist gestoppt!' 5 50
    	fi
    }
    ############################################################################################################
    function log () {
    	nano $LOGFILE
    }
    ############################################################################################################
     
    ############################################################################################################
    while true
    do
     
    dialog --clear --backtitle "$BACKTITLE" \
    --title "[ H A U P T M E N Ü ]" \
    --menu "Die verschiedenen Optionen können mit de Pfeiltasten ausgewählt werden.\n\
    Bitte Aufgabe wählen!" 15 70 4 \
    Server "Hier können die Server verwaltet werden." \
    Backup "Hier können Backups erstellt werden." \
    Log "Hiermit können die Logdateien eingesehen werden." \
    Verlassen "Schliesst den Servermanager" 2>"${INPUT}"
     
    MENUITEM=$(<"${INPUT}")
     
    case $MENUITEM in
    	Server) server;;
    	Backup) backup;;
    	Log) log;;
    	Verlassen) echo "Bye"; break;;
    esac
     
    done
     
    [ -f $OUTPUT ] && rm $OUTPUT
    [ -f $INPUT ] && rm $INPUT
 

uhelp

Member
Das kannst du (klapprig) mit dem source ( oder . Ein einzelner Punkt als Kommando ist das source Kommando) Kommando erledigen.
Das tut nichts anderes, als die danach angebebene Datei GENAU an der Stelle einzufügen, an der source (oder der Punkt) steht.

Wenn du pro Server eine Datei anlegst, kannst du nach Bedarf source server2.conf einlesen.
Dort stehen einfach deine server=some.host Anweisungen, die dann beim Einlesen die vorherig eingelesenen Werte überschreiben.
 
Snycs schrieb:
Hallo ich habe eine Frage. Ich arbeite derzeit an einem Script, mit dem ich verschiedene Minecraftserver ansteuern kann. Aktuell muss ich für jeden Server eine eigene Funktion anlegen.
Ich möchte aber eine Config File erstellen die Ungefähr so aufgebaut ist:
Code:
    server1:
         VERZECHNIS                          
         BESCHREIBUNG
    server2:
         VERZECHNIS                          
         BESCHREIBUNG
    server3:
         VERZECHNIS                          
         BESCHREIBUNG
    ...

....

Probier das aus und pass es an deine Bedürfnisse an

Code:
#!/bin/bash
# Copyright Gräfin Klara

get_params()
{
	local line param=() filt="alpha" file="$1" server="$2"
	[ -f "$file" ] || return 1
	IFS=$'\n'
	while read line; do
		[[ ${line:0:1} != [[:$filt:]] ]] && continue
		if [ $filt == "alpha" ]; then
			[ "${line%:}" != "$server" ] && continue
			filt="blank"
		else
			[ ${#param[@]} -ge 2 ] && break
			param=("${param[@]}" "${line#?}")
		fi
	done < "$file"
	[ ${#param[@]} -ne 2 ] && return 1
	printf "%s\n%s\n%s\n" "$server" "${param[0]}" "${param[1]}"
	return 0
}
[ $# -ne 2 ] || ! get_params "$1" "$2" && printf "Fehler\n"
exit 0

# dieses_programm "/etc/mein_configfile" "server2"

Gräfin Klara
 

uhelp

Member
Eine Bashfunction, die das mit sed erledigt:
Code:
get_server(){
    # reads config file and prints three double quoted strings
        # format of config file is
        # server_name:    # no blanks or chars allowed before server_name 
        #                 # and must end with a colon
        #     path        # at least one space or tab before path
        #     description # at least one space or tab before description
        # <blank line>    # one (or more) empty line(s) (no blanks allowed)
        #                 # ends a server section
        #                 # no blank lines between server_name and description!
        # 
        # if no argument given, then for each server one line is printed
        # in the form "servername" "path" "description"
        # if an argument is given, it searches for this server name and 
        # prints one line for this server, if found.
        #
        # server names can contain letters, digits "-", "_" and "."
        # pathnames may contain spaces
        #
        server_configfile="/pfad/zur/server_config.conf"

    # if server_configfile is not readable exit with status code 2
        [ -r $server_configfile ] || exit 2
    
        # check for argument and set search accordingly 
        (( $# == 1 )) && search="$1" || search='[[:alnum:]_-\.]+'

    # 
    sed -rn '/^'"$search"':/,/^$/{  # from line containing $search
                                        # to a blank line
                                s/^('"$search"'):$/"\1"/ # cut of server name and quote it
                            h                        # put it into hold space 
                                n                        # read next line into pattern space
                                s/^[[:blank:]]+(.+[^[:blank:]])[[:blank:]]*$/"\1"/
                                H     # add the quoted path from line before to hold space
                                n     # read next line
                                s/"/\\"/g   # we have to quote " if within the description
                                            # hence we substitute " with \"
                                s/^[[:blank:]]+(.*)/"\1"/ # then we quote the entire line
                                H    # and add it to the hold space
                                x    # we are done. So we get the three quoted strings from
                                     # the hold space back into the pattern space
                                s/\n/ /g # substitute the newlines between the quoted strings
                                p    # and finally print the line
                     }
                ' $server_configfile                      

}

get_server $*                    \
           | while read servername path description; do
               echo $((i++)): path: $path server name: "$servername"
                           echo "    and description: $description"
                           echo __________________________
                 done

Die letzten Zeilen ab | while read .... dienen nur dazu den Gebrauch zu zeigen.
Du kannst auch alle Kommentare löschen und das Script dann noch zu einem Einzeiler machen, indem du alle Leerzeichen am Zeilenende durch ein Semikolon ersetzt. Also jedes \n innerhalb des sed- Scriptes mit ; ersetzen.
 
Oben