[solved] Variable expandieren, gewußt wie?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
pangu
Beiträge: 1400
Registriert: 15.11.2011 20:50:52
Lizenz eigener Beiträge: GNU General Public License
Wohnort: /proc/1

[solved] Variable expandieren, gewußt wie?

Beitrag von pangu » 26.09.2013 14:00:58

Hi DF,

ich bräuchte mal wieder Hilfe von den Script-Gurus unter euch :D

./test.sh

Code: Alles auswählen

#!/bin/bash
 while read -r actualhost; do
   [[ ! ${actualhost// } || $actualhost = \#* ]] && continue;
   ruid=${actualhost%@*}
   rhn=$(printf $actualhost | awk -F'[@:]' '{print $2}')
   rprt=${actualhost##*:}
   echo Original line was=$actualhost, I generated username=$ruid, hostname=$rhn and port number=$rprt
  done < "./test.list"
./test.list

Code: Alles auswählen

foobar
john@doe
fire:911
max@pain:234
Das spuckt folgenden Output aus:
Original line was=foobar, I generated username=foobar, hostname= and port number=foobar
Original line was=john@doe, I generated username=john, hostname=doe and port number=john@doe
Original line was=fire:911, I generated username=fire:911, hostname=911 and port number=911
Original line was=max@pain:234, I generated username=max, hostname=pain and port number=234

Wie man sieht schlägt das fehl, weil in den Beispiel der test.list in Zeile 2+3 kein Doppelpunkt, bzw. kein @-Zeichen vorkommt. Dann kommt das Skript durcheinander und spuckt diesen Output aus.

Wie mache ich das, damit es wie gewollt funktioniert? Und ich möchte, dass außerdem die Variablen ruid und rprt automatisch den default-Wert "root" bzw. "22" erhalten, falls nicht anders in der Datei "test.list" angegeben und ausgelesen.

Mein gewünschter Output wäre also:
Original line was=foobar, I generated username=root, hostname=foobar and port number=22
Original line was=john@doe, I generated username=john, hostname=doe and port number=22
Original line was=fire:911, I generated username=root, hostname=fire and port number=911
Original line was=max@pain:234, I generated username=max, hostname=pain and port number=234

Hoffe auf eure Hilfestellung. Danke und Grüße,
Pangu.
Zuletzt geändert von pangu am 26.09.2013 21:33:47, insgesamt 1-mal geändert.
Man gibt Geld aus, das man nicht hat, um damit Dinge zu kaufen, die man nicht braucht, um damit Leute zu beeindrucken, die man nicht mag.

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: Variable expandieren, gewußt wie?

Beitrag von syssi » 26.09.2013 18:09:26

Da hilft leider nur ein Regelwerk (if-Bedingungen), welche das Parsing definieren, welches du automatisch im Kopf machst:

Code: Alles auswählen

foobar  # enthaelt kein @ also ists ein host. 
john@doe # einhaelt ein @ es gibt also user & hostname
fire:911 # enthaelt kein @ also ists ein host. enthaelt ein ":", kann man also aufspalten in host und port
max@pain:234 # enthaelt alle merkmale
Du solltest nicht das @ und den Doppelpunkt als gleichwertige Trenner nutzen. Sie trennen unterschiedliche Dinge.

Benutzeravatar
pangu
Beiträge: 1400
Registriert: 15.11.2011 20:50:52
Lizenz eigener Beiträge: GNU General Public License
Wohnort: /proc/1

[solved] Re: Variable expandieren, gewußt wie?

Beitrag von pangu » 26.09.2013 21:10:19

Ok, hast Recht. Danke dir. Hab's wie folgt gelöst:

Code: Alles auswählen

while read -r line; do
    if [[ ! ${line// } || $line = \#* ]]; then
        continue
    fi
    
    user=root
    port=22
    
    case $line in
        *@*) user=${line%@*}
             
             host=${line#*@}
             host=${host%:*}
        
             case $line in
                 *:*)
                      port=${line##*:}
             esac ;;
        
          *)
             host=$line
          
             case $line in
                 *:*)
                      host=${line%:*}
                      port=${line#*:}
             esac
    esac
    
    echo "Original Eintrag aus Datei: $line"
    echo "Der Username: $user"
    echo "Der Hostname: $host"
    echo "Der Port: $port"
    echo
done < test.list
Man gibt Geld aus, das man nicht hat, um damit Dinge zu kaufen, die man nicht braucht, um damit Leute zu beeindrucken, die man nicht mag.

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: Variable expandieren, gewußt wie?

Beitrag von syssi » 26.09.2013 21:19:07

Fuer den Port koenntst du noch ein Default definieren. Wenn die Variable nach dem parsen leer ist, dann gehoert x hinein.

Benutzeravatar
pangu
Beiträge: 1400
Registriert: 15.11.2011 20:50:52
Lizenz eigener Beiträge: GNU General Public License
Wohnort: /proc/1

Re: Variable expandieren, gewußt wie?

Beitrag von pangu » 26.09.2013 21:33:33

Wie meinste das? ich hab doch für port einen default von 22 konfiguriert.
Man gibt Geld aus, das man nicht hat, um damit Dinge zu kaufen, die man nicht braucht, um damit Leute zu beeindrucken, die man nicht mag.

Antworten