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: 195 Punkte bei 30 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: 230 Punkte bei 34 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: 199 Punkte bei 34 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

Installation Linux mint auf stick
Reiner Schulz, 10.12.2017 17:34, 0 Antworten
Hallo, ich hab ein ISO-image mit Linux Mint auf einem Stick untergebracht Jetzt kann ich auch...
Canon Maxify 2750 oder ähnlicher Drucker
Hannes Richert, 05.12.2017 20:14, 4 Antworten
Hallo, leider hat Canon mich weiterverwiesen, weil sie Linux nicht supporten.. deshalb hier die...
Ubuntu Server
Steffen Seidler, 05.12.2017 12:10, 1 Antworten
Hallo! Hat jemand eine gute Anleitung für mich, wie ich Ubuntu Server einrichte? Habe bisher...
Tinte sparen bei neuem Drucker
Lars Schmitt, 30.11.2017 17:43, 2 Antworten
Hi Leute, ich habe mir Anfang diesen Monats einen Tintenstrahldrucker angeschafft, der auch su...
Für Linux programmieren
Alexander Kramer, 25.11.2017 08:47, 3 Antworten
Ich habe einen Zufallsgenerator entworfen und bereits in c++ programmiert. Ich möchte den Zufalls...

Stellenmarkt

Jetzt auf den Mailinglisten

Re: [EasyLinux-Ubuntu] Firefox : JavaScript
Heiko Ißleib, 09.12.2017 20:55
http://www.giga.de/extra/javascript/tipps/javascript-aktivieren-firefox-chrome-internet-explorer-safari-opera-s...
Re: [EasyLinux-Ubuntu] mit sed TABs entfernen
Matthias, 09.12.2017 18:56
Hallo Uwe, Am Dienstag, 28. November 2017, 08:47:28 CET schrieb Uwe Herrmuth: > Hallo Matthias, hallo Ha...
Re: [EasyLinux-Ubuntu] Firefox : JavaScript
Frank von Thun, 09.12.2017 17:34
Am 09.12.2017 um 14:59 schrieb Richard Kraut: > Am Samstag, den 09.12.2017, 14:51 +0100 schrieb Hartmut Ha...
Re: [EasyLinux-Ubuntu] Firefox : JavaScript
Richard Kraut, 09.12.2017 14:59
Am Samstag, den 09.12.2017, 14:51 +0100 schrieb Hartmut Haase: > > wenn ich auf meinem PC Internet-R...
[EasyLinux-Ubuntu] Firefox : JavaScript
Hartmut Haase, 09.12.2017 14:51
Hallo Liste, wenn ich auf meinem PC Internet-Radio hören will, bekomme ich eine Meldung, daß ich JavaScrip...