Bash - verschachtelte Variablenersetzung, das geht doch eleganter als meine Lösung?

Josef Federl - Dienstag, 18. Juli 2017 20:24:10 - 3 Antworten

#!/bin/bash
#Ziel des Skriptes wird sein die ID zu extrahieren hier nur als Consolentest:
root@~: eingang="RECENT [1] time 1496763560, type 8001, id 134750, value 21.5547"
root@~: teil1=${eingang##*id}
root@~: echo ${teil1%%,*}
134750

ENDE

Soweit so gut-> funktioniert,
Nur bin ich der Meinung dass das noch schlanker geht, nur mir fällt einfach nicht mehr ein wie?
So einfach verschachtelt leider nicht, weil ich da irgendwas vergesse nur was?
hab schon einige Try-Error-Versuche mit Backticks Klammen Anführungszeichen hinter mir.

root@~: echo ${${eingang##*id}%%,*}
bash: ${"${eingang##*id}"%%,*}: Falsche Variablenersetzung.

Danke.

Antworten
verschachtelte Variablenersetzung
pseudomatix (unangemeldet), Freitag, 28. Juli 2017 11:57:38
Ein/Ausklappen

hallo,
das Zerlegen von "RECENT [1] time 1496763560, type 8001, id 134750, value 21.5547"
mittels ${##*} etc, mit zwei Schrtten ist die eleganteste Lösung, die Du richtig erraten hast. Alles andere kann nur schlimmer werden.

In bash gilt noch [[ $eingang =~ pattern ]] und daraus ${BASH_REMATCH[3]} oder so, ist aber nicht portiebar zu /bin/dash oder /bin/rsh. Warung vor versteckten \tabs!

Beispiele:
[[ $eingang =~ id\ ([0-9]+) ]] && echo "${BASH_REMATCH[1]}"

[[ $eingang =~ id[[:blank:]]([0-9]+) ]] && echo "${BASH_REMATCH[1]}" # for \tabs inbetween




Bewertung: 204 Punkte bei 40 Stimmen.
Den Beitrag bewerten: Gut / Schlecht
Die Frage nach dem Wieso?
Josef Federl, Samstag, 22. Juli 2017 18:31:04
Ein/Ausklappen

mit awk könnte es gehen, stimmt, aber Ressourcen schonender dürfte es nicht sein.
Bin immer noch hartnäckig am ausprobieren,
denn ich will ja auch was lernen :)

[root@comp]# echo ${`${eingang##*id}`%%,*}
bash: ${`${eingang##*id}`%%,*}: Falsche Variablenersetzung.
[root@comp]# echo ${'${eingang##*id}'%%,*}
bash: ${'${eingang##*id}'%%,*}: Falsche Variablenersetzung.
[root@comp]# eval echo ${'${eingang##*id}'%%,*}
bash: ${'${eingang##*id}'%%,*}: Falsche Variablenersetzung.
[root@comp]# eval echo ${`${eingang##*id}`%%,*}
bash: ${`${eingang##*id}`%%,*}: Falsche Variablenersetzung.
[root@comp]# eval echo ${${eingang##*id}%%,*}
bash: ${${eingang##*id}%%,*}: Falsche Variablenersetzung.
[root@comp]# eval echo ${"${eingang##*id}"%%,*}
bash: ${"${eingang##*id}"%%,*}: Falsche Variablenersetzung.
[root@comp]# eval echo ${~${eingang##*id}%%,*}
bash: ${~${eingang##*id}%%,*}: Falsche Variablenersetzung.
[root@comp]# eval echo ${(${eingang##*id)}%%,*}
bash: ${(${eingang##*id)}%%,*}: Falsche Variablenersetzung.
[root@comp]# eval echo ${(${eingang##*id})%%,*}
bash: ${(${eingang##*id})%%,*}: Falsche Variablenersetzung.
[root@comp]# eval echo ${((${eingang##*id}))%%,*}
bash: ${((${eingang##*id}))%%,*}: Falsche Variablenersetzung.
[root@comp]# echo $'${eingang##*id}'%%,*
${eingang##*id}%%,*
[root@comp]# echo "$'${eingang##*id}'%%,*"
$' 134750, value 21.5547'%%,*
[root@comp]# echo "${'${eingang##*id}'}%%,*"
bash: ${'${eingang##*id}'}%%,*: Falsche Variablenersetzung.
[root@comp]# echo "$'${eingang##*id}'%%,*"
$' 134750, value 21.5547'%%,*
[root@comp]# eval echo "${'${eingang##*id}'}%%,*"
bash: ${'${eingang##*id}'}%%,*: Falsche Variablenersetzung.
[root@comp]# echo "${'${eingang##*id}'}%%,*"
bash: ${'${eingang##*id}'}%%,*: Falsche Variablenersetzung.
[root@comp]# echo "$'${eingang##*id}'%%,*"
$' 134750, value 21.5547'%%,*
[root@comp]# echo "$`${eingang##*id}`%%,*"
bash: 134750,: Kommando nicht gefunden.
$%%,*
[root@comp]# echo "${`${eingang##*id}`%%,* }"
bash: ${`${eingang##*id}`%%,* }: Falsche Variablenersetzung.
[root@comp]# eval echo "${`${eingang##*id}`%%,* }"
bash: ${`${eingang##*id}`%%,* }: Falsche Variablenersetzung.



Bewertung: 226 Punkte bei 46 Stimmen.
Den Beitrag bewerten: Gut / Schlecht
Re: Bash - verschachtelte Variablenersetzung ... oder Pipe an awk?
Michael Rick, Mittwoch, 19. Juli 2017 15:27:05
Ein/Ausklappen

Reiche doch deinen "eingang" in einer Pipe an awk weiter
echo "$eingang" | awk -F, '{print $3}' | awk '{print $2}'


Bewertung: 219 Punkte bei 41 Stimmen.
Den Beitrag bewerten: Gut / Schlecht

Ähnliche Artikel

  • Shell-Tipps
    Erfahrene Linux-Nutzer schwören auf flexible Kommandozeilentools, mit denen sie manche Aufgabe schneller bewältigen als in grafischen Programmen. Wir stellen interessante Anwendungen und Aufrufparameter vor, um auch Einsteiger zu einem Ausflug in die Shell zu ermutigen.
  • Shell-Tipps
    Erfahrene Linux-Nutzer schwören auf flexible Kommandozeilentools, mit denen sich manche Aufgabe schneller bewältigen lässt als in grafischen Programmen. Wir stellen die wichtigsten Anwendungen vor, um auch Einsteiger zu einem Ausflug in die Shell zu ermutigen.
  • Kreislauf
    Schleifen ermöglichen das mehrmalige Abarbeiten von Anweisungen. Dabei kann das begrenzende Ereignis sowohl außerhalb als auch innerhalb der Schleife liegen.
  • Jo´s alternativer Desktop
    Wie Ihr Linux-Desktop aussieht, bestimmen allein Sie. Mit deskTOPia nehmen wir Sie regelmäßig mit auf die Reise ins Land der Window-Manager und Desktop-Umgebungen, stellen Nützliches und Farbenfrohes, Hingucker und hübsches Spielzeug vor. Nachdem sich hier nun verschiedene Window-Manager vorstellten, ist es an der Zeit, diese um ein für viele wichtiges Feature zu ergänzen: Desktop-Icons.
  • Zu Befehl: mv & mmv
    Mit mv ("move") steht Ihnen ein Standardkommando zur Verfügung, das schon seit Ewigkeiten auf Unix-Systemen dabei hilft, Dateien und Verzeichnisse zu verschieben oder umzubenennen. Leider wird es etwas komplizierter, wenn gleich mehrere Dinge in einem Rutsch durch die Gegend geschoben werden sollen. Mit längeren Konstruktionen und for-Schleifen lassen sich diese Aufgaben erledigen, aber warum kompliziert, wenn's auch einfach geht? Das Programm mmv ("multiple move") hilft dabei.

Aktuelle Fragen

Internet abschalten
Karl-Heinz Hauser, 20.02.2018 20:10, 0 Antworten
In der Symbolleiste kann man das Kabelnetzwerk ein und ausschalten. Wie sicher ist die Abschaltu...
JQuery-Script läuft nicht mit Linux-Browsern
Stefan Jahn, 16.02.2018 12:49, 2 Antworten
Hallo zusammen, ...folgender goldener Code (ein jQuery-Script als Ergebnis verschiedener Exper...
XSane-Fotokopie druckt nicht mehr
Wimpy *, 30.01.2018 13:29, 1 Antworten
openSuse 42.3 KDE 5.8.7 Seit einem Software-Update druckt XSane keine Fotokopie mehr aus. Fehler...
TOR-Browser stürzt wegen Wikipedia ab
Wimpy *, 27.01.2018 14:57, 0 Antworten
Tor-Browser 7.5 based on Mozilla Firefox 52.8.0 64-Bit. Bei Aufruf von http: oder https://de.wi...
Wifikarte verhindert Bootvorgang
Maik Kühn, 21.01.2018 22:23, 1 Antworten
iwlwifi-7265D -26 failed to load iwlwifi-7265D -25 failed to load iwlwifi-7265D -24 failed to l...

Stellenmarkt

Jetzt auf den Mailinglisten

[EasyLinux-Ubuntu] Steuerzeichen aus text-Datei entfernen
Karl-Heinz, 21.02.2018 22:20
Hallo zusammen, ich habe eine .txt-Datei an der an jedem Zeilenende eine Zeilenumbruch steht. Diesen möchte...
Re: [EasyLinux-Ubuntu] HP Pavilion g7
Willi Zelinka, 21.02.2018 18:33
Hallo Frank, Am Mittwoch, 21. Februar 2018, 16:36:55 CET schrieb Frank: > Hi Listlinge > > Ic...
Re: [EasyLinux-Ubuntu] HP Pavilion g7
Frank von Thun, 21.02.2018 18:25
Am 21.02.2018 um 16:36 schrieb Frank: > Hi Listlinge > > Ich habe einen HP Pavilion g7 geschenk...
Re: [EasyLinux-Ubuntu] HP Pavilion g7
Steffen Weyh, 21.02.2018 18:05
 Genaue Modelbezeichnung und Nummer des Typs? Wie es aussieht ist da kein Betriebssystem instaliiert...
[EasyLinux-Ubuntu] HP Pavilion g7
Frank, 21.02.2018 16:36
Hi Listlinge Ich habe einen HP Pavilion g7 geschenkt bekommen, angeblich mit Win10(was ich nicht brauche) w...