Re: Bash Shell Skripting: Doppelhochkamma & Variablen ... ich schaff's nicht
Geizhals » Forum » Linux-Support » Bash Shell Skripting: Doppelhochkamma & Variablen ... ich schaff's nicht (18 Beiträge, 424 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
.
Re: Bash Shell Skripting: Doppelhochkamma & Variablen ... ich schaff's nicht
23.07.2024, 08:36:53
Richtiges Quoting ist nicht immer leicht, aber die Leute machen es sich oft schwerer, als es sein muesste ;) Ich zeig mal, wie ich mir sowas innerhalb weniger Sekunden "hinkonstruiere".

Zuerst pruefe ich mit einem Prefix-`echo`, was denn das erwartete Ergebnis ist (ich hab kein(e) influxdb, und kann das deshalb lokal nicht Ende zu Ende nachvollziehen):


$ echo influx query 'from(bucket: "mybucket") |> range(start: -30d) |> drop(columns: ["_start", "_stop"])'

influx query from(bucket: "mybucket") |> range(start: -30d) |> drop(columns: ["_start", "_stop"])


So weit, so gut. Wie schaut das jetzt aus, wenn ich da drin "naiv" einen Shellvariable expandieren will?


$ b='otherbucket'
$ b=foobar echo influx query 'from(bucket: "${b}") |> range(start: -30d) |> drop(columns: ["_start", "_stop"])'

influx query from(bucket: "${b}") |> range(start: -30d) |> drop(columns: ["_start", "_stop"])


OK. Jetzt hab ich mehrere Moeglichkeiten, das ${b} da drin so zu escapen, dass es auch substituiert wird. Da ich weisz, wie C bzw. analog dazu auch die Bourne Shell Strings konkatenieren, nutze ich das fuer diesen imho recht einfachen Weg:


$ b='otherbucket'
$ echo influx query 'from(bucket: "'"${b}"'") |> range(start: -30d) |> drop(columns: ["_start", "_stop"])'

influx query from(bucket: "otherbucket") |> range(start: -30d) |> drop(columns: ["_start", "_stop"])



Was dabei im Detail passiert:

Ich terminiere den single quoted String (-> keine Expansion) unmittelbar vor der Stelle, wo ich meine Variable expandiert haben moechte. Dort beginne ich einen double quoted String (-> Variable Expansion passiert in Infixes), in dem ich eigentlich nur meine Expansion notiere, und terminiere diesen String gleich danach. Der gesamte double quotes String ist also diese Zeichenkette: "${b}"
Gleich danach beginne ich wieder einen single quoted String (-> keine Expansion), und notiere das wie gehabt.

Das sind also insg. drei Elemente, die ich ohne Whitespace/Field Separator aneinanderpappe, und nur im mittleren wird Expansion betrieben - weil dort eben double statt single quotes verwendet werden.

Nochmal zur Verdeutlichung die drei "Abschnitte", die zu einem einzigen String/Argumentvektorelement "verschmelzen", wenn man sie wie weiter oben gezeigt richtig aneinanderreiht:

1. 'from(bucket: "'

2. "${b}"

3. '") |> range(start: -30d) |> drop(columns: ["_start", "_stop"])'


Hth, auch beim naechsten Mal! ;)
 --

echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc

So long, and thanks for all the uptime!


[ Dieser Beitrag wurde inzwischen editiert. Die aktuelle Version befindet sich hier. ]
Antworten PM Alle Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung