[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: bash, cat, grep und Variablen



Helge Reimer <hrnews@onlinehome.de> (Mo 01 Okt 2018 18:32:27 CEST):
> Hallo ,
>
> vielleicht ein unglücklicher Thread Titel aber ich möchte mir zum ersten mal
> ein kleines bash script bauen und hab hier ein unerwartetes Ergebnis, wenn ich
> die Ausgabe von 'grep' in eine Variable packe und mir die dann anzeigen lasse.
> Hier mal ein paar Schnipsel:
>
> helge@debian:~$ cd /sys/devices/
> helge@debian:/sys/devices$ altmodes=`find -name alternate_modes`

altmodes enhält eventuell jetzt mehrere Zeilen.
Sollte im weiteren Verlauf ggf. bedacht werden.

> helge@debian:/sys/devices$ echo $altmodes
> ./pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/0003:046D:C24F.0007/alternate_modes

> helge@debian:/sys/devices$ cat $altmodes | grep "*"
> native: G29 Racing Wheel *
> G29: G29 Racing Wheel *

Die Verwendung von "*" ist nicht ok, das ist kein zulässiger Regulärer
Ausdruck, unglücklicherweise toleriert Grep das aber und „denkt“, daß Du
tatsächlich einen * suchst.

(Es zeigt anderes Verhalten bei -E bzw. noch mal anderes bei -P,
vielleicht ist da sogar dokumentiert irgendwo, daß ein Quantifier am
Anfang eines Audrucks kein Quantifier mehr ist, wenn man POSIX RE
verwendet - ja, ist in regex(7), kurz vor der BUGS section:

       ning of a parenthesized subexpression, '$' is an ordinary character except at the end of the
       RE or(!) the end of a parenthesized subexpression, and '*' is an ordinary  character  if  it
       appears  at the beginning of the RE or the beginning of a parenthesized subexpression (after
       a possible leading '^').


> Der Pfad zu 'alternate_modes' wurde gefunden und nach den Zeilen mit '*'
> greppen klappt auch. Ausgabe korrekt.

Ja, soweit so gut.

> Wenn ich diese Ausgabe aber in eine Variable packe, dann passiert folgendes:
>
> helge@debian:/sys/devices$ actmode=$(cat $altmodes | grep "*")
> helge@debian:/sys/devices$ echo $actmode
> native: G29 Racing Wheel breakpoint cpu cstate_core cstate_pkg i915 kprobe
...
> Versteh ich gerade nicht.
> Kann mir jemand auf die Sprünge helfen?

Du möchstest

    echo "$actmode"

machen. Dein actmode enthält einen *, wenn Du mal nachliest über
die Reihenfolge der Aktionen beim Parsen der Kommandozeile, wirst Du
feststellen, daß als eine der ersten Aktionen die Variablen expandiert
werden.

    Best regards from Dresden/Germany
    Viele Grüße aus Dresden
    Heiko Schlittermann
--
 SCHLITTERMANN.de ---------------------------- internet & unix support -
 Heiko Schlittermann, Dipl.-Ing. (TU) - {fon,fax}: +49.351.802998{1,3} -
 gnupg encrypted messages are welcome --------------- key ID: F69376CE -
 ! key id 7CBF764A and 972EAC9F are revoked since 2015-01 ------------ -

Attachment: signature.asc
Description: PGP signature


Reply to: