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: 97 Punkte bei 6 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: 135 Punkte bei 14 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: 136 Punkte bei 17 Stimmen.
Den Beitrag bewerten: Gut / Schlecht

Ähnliche Artikel

  • 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.
  • 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.
  • 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

Samsung VG-KBD1500 - Bluetooth-Tastatur mit Touchpad mit Xubuntu 16.04.2 LTS
Linux- & BSD-UserGroup im Weserbergland, 16.08.2017 19:16, 0 Antworten
Bin grad mit "meinem Latein am Ende" darum hier mal so in den Raum geworfen. Samsung VG-KBD1500 -...
Tails verbindet nicht mit WLan
Georg Vogel, 30.07.2017 15:06, 5 Antworten
Hallo zusammen! Habe mir von Linux Mint aus einen Tails USB-Stick erstellt. Läuft soweit gut,...
Genivi for Raspberry Pi 3
Sebastian Ortmanns, 28.07.2017 10:37, 1 Antworten
I try to build a Genivi Development Platform for Rasberry Pi 3. But I always get the failures bel...
Bash awk Verständnis-Frage
Josef Federl, 22.07.2017 17:46, 2 Antworten
#!/bin/bash # Skriptdateiname = test.sh spaltennummer=10 wert=zehner awk '{ $'$spaltennummer'...
Bash - verschachtelte Variablenersetzung, das geht doch eleganter als meine Lösung?
Josef Federl, 18.07.2017 20:24, 3 Antworten
#!/bin/bash #Ziel des Skriptes wird sein die ID zu extrahieren hier nur als Consolentest: root@...

Jetzt auf den Mailinglisten

Re: [EasyLinux-Ubuntu] bash Leerzeichen vor dem Curser
Uwe Herrmuth, 16.08.2017 21:56
Hallo Volker, Volker Borst schrieb am 16.08.2017 um 19:22: > > echo $PS1 > > ${debian_chr...
Re: [EasyLinux-Ubuntu] bash Leerzeichen vor dem Curser
Volker Borst, 16.08.2017 19:22
Hallo Uwe, > echo $PS1 ${debian_chroot:+($debian_chroot)}\u@\h:\w\$ Einen neuen Benutzer habe ich jet...
Re: [EasyLinux-Ubuntu] bash Leerzeichen vor dem Curser
Uwe Herrmuth, 16.08.2017 07:58
Hallo Volker, Volker schrieb am 12.08.2017 um 12:11: > Nach dem Aufrufen von 16.04 habe ich in der bash...
Re: [EasyLinux-Ubuntu] Internet Geschwindigkeit
Udo Teichmann, 14.08.2017 15:44
Am Sonntag, den 13.08.2017, 07:16 +0200 schrieb Alfred Zahlten: Hallo Alfred > > https://www.d...
Re: [EasyLinux-Ubuntu] Internet Geschwindigkeit
Alfred Zahlten, 13.08.2017 07:16
Am 12.08.2017 um 18:47 schrieb Udo Teichmann:> Am Samstag, den 12.08.2017, 08:47 +0200 schrieb Rainer: G...