ubuntuusers.de

Bash: Wie echo Ausgabe an Variable übergeben ?

Status: Ungelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

Theo.Spengler

Anmeldungsdatum:
4. Januar 2019

Beiträge: 57

Das folgende erste bash Beispiel funktioniert:

1
2
    url="http://user:pw@example.com:80/"
    echo $url | sed -e 's/[^/]*\/\/\([^@]*@\)\?\([^:/]*\).*/\2/'

Terminal Ausgabe:

    example.com

Das folgende Beispiel bash funktioniert nicht:

1
2
3
    url="http://user:pw@example.com:80/"
    domain=$url | sed -e 's/[^/]*\/\/\([^@]*@\)\?\([^:/]*\).*/\2/' # syntaktisch augenscheinlich fehlerhafte Zeile
    echo $domain

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11261

Wohnort: München

Das Problem an domain=$url ist, dass es eine Zuweisung ist, die keine Ausgabe auf stdout erzeugt, die an den nachfolgenden sed-Befehl weitergeleitet werden könnte und die Ausgabe des sed-Befehls wird keiner Variablen zugewiesen.

Das könnte man z.B. so machen:

1
2
3
url="http://user:pw@example.com:80/"
domain=$(sed -e 's/[^/]*\/\/\([^@]*@\)\?\([^:/]*\).*/\2/' <<< "$url")
echo $domain

Theo.Spengler

(Themenstarter)

Anmeldungsdatum:
4. Januar 2019

Beiträge: 57

seahawk1986 schrieb:

Das könnte man z.B. so machen:

1
2
3
url="http://user:pw@example.com:80/"
domain=$(sed -e 's/[^/]*\/\/\([^@]*@\)\?\([^:/]*\).*/\2/' <<< "$url")
echo $domain

Das funktioniert bestens.

Danke

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Obwohl selbst ein Sed-Freund, möche ich die Verkettung 2er Shellbefehle als Alternative vorstellen:

1
2
3
4
5
6
echo $(echo ${url/*@})
example.com:80/
url2=$(echo ${url/*@})
domain=$(echo ${url2%%:*})
echo $domain
example.com

Dass man beide ${}-Befehle zu einem größeren verlöten kann glaube ich nicht, aber im Abschnitt "Parameter Expansion" (man bash) findet man eine ausführliche Übersicht der Möglichkeiten.

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Wohnort: Göttingen

Ich glaube auch, dass man zwei dieser ${} nicht verlöten kann. Ich hatte das zumindest mal mit diversen Versionen ausprobiert und nicht hinbekommen.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11261

Wohnort: München

Doc_Symbiosis schrieb:

Ich glaube auch, dass man zwei dieser ${} nicht verlöten kann. Ich hatte das zumindest mal mit diversen Versionen ausprobiert und nicht hinbekommen.

Das hängt von der Shell ab - die ZSH kann das zum Beispiel:

% url="http://user:pw@example.com:80/"
% echo "${${url/*@}%%:*}"
example.com 

In der Bash kann man das zumindest etwas verkürzen:

1
2
url="http://user:pw@example.com:80/"
domain=$(tmp=${url/*@}; echo ${tmp%%:*})

Gerade wenn Spezialfälle im Spiel sind, kann es sich lohnen das mit einer Bibliothek zu machen, die dafür gedacht ist - also z.B. https://docs.python.org/3/library/urllib.parse.html#url-parsing:

$ url="http://user:pw@example.com:80/"
$ python3 -c "import urllib.parse as p; print(p.urlparse('${url}').hostname)"
example.com 

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Man kann auch den Sedbefehl deutlich entschlacken:

1
domain=$(echo $url | sed -r 's/.*@(.*):.*/\1/') ; echo $domain
Antworten |