wie 3 Anführungszeichen in Shellskript ? [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
xcomm
Beiträge: 793
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

wie 3 Anführungszeichen in Shellskript ? [gelöst]

Beitrag von xcomm » 27.05.2023 13:45:15

Hi Gemeinde,

tue mich leider schwer eine 3. Ebene Anführungszeichen hier mitzugeben:

Habe eine json-Spalte in MySQL mit Wertepaaren welche auch interne Anführungszeichen hat und möchte aus einem Shellscript da reinschreiben. Bräuchte also eine weitere Ebene Anführungszeichen.
(Innen mit \" hat nicht funktioniert.)

mysql -e"update tabelle set foo='{"cb7": {"bla": '$shell_var', "blue": false}}' where bedingung='$var';"

Danke
Zuletzt geändert von xcomm am 27.05.2023 18:22:07, insgesamt 1-mal geändert.

Benutzeravatar
paedubucher
Beiträge: 856
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: wie 3 Anführungszeichen in Shellskript ?

Beitrag von paedubucher » 27.05.2023 16:32:38

So aus der Hüfte geschossen: Kannst du den Befehl mit printf erstellen und dann in den mysql-Client hineinpipen?
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

mludwig
Beiträge: 797
Registriert: 30.01.2005 19:35:04

Re: wie 3 Anführungszeichen in Shellskript ?

Beitrag von mludwig » 27.05.2023 16:50:56

Ich weiss nicht genau ob du sowas gemeint hast, aber vielleicht kannst du was fuer dein Skript anpassen?

Code: Alles auswählen

mysql> select * from TESTTABELLE;
+------+--------+------+
| id   | day    | time |
+------+--------+------+
|    1 | MONTAG | TEST |
+------+--------+------+
Shell Skript:

Code: Alles auswählen

#!/bin/bash
shell_var=STRING
var=MONTAG
mysql -u user database << EOF
update TESTTABELLE set time = '{"cb7i": {"bla": "$shell_var", "blue": false}}' where day = "$var";
EOF

Code: Alles auswählen

mysql> select * from TESTTABELLE;
+------+--------+--------------------------------------------+
| id   | day    | time                                       |
+------+--------+--------------------------------------------+
|    1 | MONTAG | {"cb7i": {"bla": "STRING", "blue": false}} |
+------+--------+--------------------------------------------+
1 row in set (0,00 sec)

Benutzeravatar
paedubucher
Beiträge: 856
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: wie 3 Anführungszeichen in Shellskript ?

Beitrag von paedubucher » 27.05.2023 17:07:20

Hm, nur mit printf kriege ich es auch nicht hin.

Das wäre eine Lösung in Python:

Code: Alles auswählen

#!/usr/bin/env python3

shell_var = 'STRING'
var = 'MONTAG'
template = '''
update TESTTABELLE set time = '{"cb7i": {"bla": "%s", "blue": false}}' where day = "%s";
'''
print(template.strip() % (shell_var, var))
Ausgabe:

Code: Alles auswählen

update TESTTABELLE set time = '{"cb7i": {"bla": "STRING", "blue": false}}' where day = "MONTAG";
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
xcomm
Beiträge: 793
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: wie 3 Anführungszeichen in Shellskript ?

Beitrag von xcomm » 27.05.2023 18:21:45

Danke Euch - großartig!!!

Nehme die Bash-Variante, weil für mich leichter / bin oldschool. ;-) Tut Super!

Code: Alles auswählen

mysql -u user -Ddatabase << EOF
update TESTTABELLE set time = '{"cb7i": {"bla": "$shell_var", "blue": false}}' where day = "$var";
EOF

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: wie 3 Anführungszeichen in Shellskript ? [gelöst]

Beitrag von Meillo » 28.05.2023 10:14:56

Um den urspruenglichen Ansatz nochmal zurueckzukommen ...
xcomm hat geschrieben: ↑ zum Beitrag ↑
27.05.2023 13:45:15
tue mich leider schwer eine 3. Ebene Anführungszeichen hier mitzugeben:

Habe eine json-Spalte in MySQL mit Wertepaaren welche auch interne Anführungszeichen hat und möchte aus einem Shellscript da reinschreiben. Bräuchte also eine weitere Ebene Anführungszeichen.
Ich verstehe nicht genau was genau du haben willst, denke mir aber, dass es darum geht, dass die Double-Quotes um die Json-Werte erhalten bleiben sollen.
xcomm hat geschrieben: ↑ zum Beitrag ↑
27.05.2023 13:45:15
(Innen mit \" hat nicht funktioniert.)
[/quoŧe]
Diese Aussage kann ich nicht nachvollziehen, denn bei mir funktioniert das
wunderbar. ;-)

Vermutlich brauchst du diesen Befehl:

Code: Alles auswählen

:-/ shell_var="a  b"

:-/ var="c  d"

:-/ echo 'mysql -e"update tabelle set foo='\''{\"cb7\": {\"bla\": \"'"$shell_var"'\", \"blue\": false}}'\'' where bedingung='"'$var'"';"'
mysql -e"update tabelle set foo='{\"cb7\": {\"bla\": \"a  b\", \"blue\": false}}' where bedingung='c  d';"
(Es ist wichtig, dass die Variablen-Expansionen in einem Double-Quote-Kontext stehen, um den Whitespace zu erhalten. Man sieht das hier bei den doppelten Leerzeichen gut.)


Zugegeben, das sind nun ganz schoen viele Quotes! :-D

Intuitiv sind solche Quoting-Spielchen schwer zu verstehen, aber mit mechanischem Befolgen der Quoting-Regeln (IMO am besten mit Farbe auf Papier) laesst sich das ganz gut konstruieren und dekonstruieren.

paedubuchers Vorschlag macht es natuerlich einfacher: Statt alles in eine Zeile zu fummeln, zerteilt man das Problem in Teilprobleme (Divide and Conquer) und nutzt einen weiteren Quoting-Mechanismus (Heredoc), um mehr Uebersicht zu bekommen.
Use ed once in a while!

Antworten