bash: Zeichen '*' in Strings

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
raa
Beiträge: 411
Registriert: 19.12.2013 10:16:19

bash: Zeichen '*' in Strings

Beitrag von raa » 11.07.2016 13:31:36

Hallo,

ich arbeite mit SQL - Strings in bash-Scripten. Die Shell macht aber aus dem manchmal unvermeidlichen Stern, etwa in

Code: Alles auswählen

SELECT * FROM tabelle
na, was wohl? Richtig: Eine Auflistung der Dateien im aktuellen Verzeichnis. :wink:

Mit dem Statement

Code: Alles auswählen

SELECT datei1 datei2 datei3 FROM tabelle 
kann dann natürlich die Datenbank nichts anfangen. :wink:

Wie kann ich die Shell da "austricksen"? Hab's schon mit Maskierung versucht (klappt z.B. bei Hochkommas wunderbar, die reicht sie unkommentiert durch, wenn man einen Backslash davorsetzt), das bringt's hier aber nicht.

Wer weiß eine Lösung? Danke im voraus.

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: bash: Zeichen '*' in Strings

Beitrag von newdeb » 11.07.2016 13:54:37

set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
Set or unset values of shell options and positional parameters.
...
-f Disable file name generation (globbing).

raa
Beiträge: 411
Registriert: 19.12.2013 10:16:19

Re: bash: Zeichen '*' in Strings

Beitrag von raa » 11.07.2016 14:07:34

Jo, einfach:

Code: Alles auswählen

set -f
Danke, det bringt et! :wink:

Das "globbing" ist aber nicht so wörtlich zu nehmen, der Befehl arbeitet nicht systemweit (das hatte ich zuerst befürchtet).

raa
Beiträge: 411
Registriert: 19.12.2013 10:16:19

Re: bash: Zeichen '*' in Strings

Beitrag von raa » 11.07.2016 21:34:02

Umpf, es geht auch anders. Ich hab' die gleiche Frage mal in der NG "at.linux" gestellt:

Am 11.07.2016 um 18:22 schrieb Stephan Weinberger:
> On 11.07.2016 14:09, Hartmut Kraus wrote:
>>>
>>> Wer weiß eine Lösung?
>>
>> Schon gefunden. Eigentlich ganz einfach, wenn man's weiß. Wie (fast)
>> immer.
>>
>> viewtopic.php?f=34&t=161509#p1097925
>>
>
> Blöd ist halt, wenn du globbing brauchst...
>
> Alternativen (bash und die allermeisten anderen):
>
>> echo "bla * blub"

Japp, das geht. Aber schon wenn ich (wie's oft nicht anders geht), schreibe

strSQL="laaaaaanger String, der bei jedem Schleifendurchauf länger wird"

und da irgendwo ein Sternchen drin ist, geht's schief.

> in "" werden Variablen interpretiert, in '' nicht:

Das brauche ich aber. Meine Scripte lesen Dateien zeilenweise aus, schnippeln sich bestimmte Strings aus den Zeilen 'raus und fummeln die in die SQL-Strings 'rein, die dann ausgeführt werden. Das geht nur über Variablen. Manchmal muss ich aber eben auch eine Abfrage machen, wo ein Sternchen drin ist. Also danke für den Tipp mit "echo" - das geht nun wieder:

echo "SQL-Statement * mit * Sternchen" | mysql -u $dbUser -p$dbPW $dbName

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: bash: Zeichen '*' in Strings

Beitrag von newdeb » 12.07.2016 08:23:05

raa hat geschrieben: >
> Blöd ist halt, wenn du globbing brauchst...
>
Dann schalt es wieder ein:

Code: Alles auswählen

set +f

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

Re: bash: Zeichen '*' in Strings

Beitrag von Meillo » 12.07.2016 11:12:52

raa hat geschrieben: Wie kann ich die Shell da "austricksen"? Hab's schon mit Maskierung versucht (klappt z.B. bei Hochkommas wunderbar, die reicht sie unkommentiert durch, wenn man einen Backslash davorsetzt), das bringt's hier aber nicht.
Warum nicht? Den Stern zu quoten waere doch immer der erste Ansatz ... bevor man so abgefahrene Dinge, wie das Globbing ganz abzuschalten, waehlt.

Also

Code: Alles auswählen

echo "select * from user;" | mysql website
funktioniert bei mir wunderbar.

raa hat geschrieben: echo "SQL-Statement * mit * Sternchen" | mysql -u $dbUser -p$dbPW $dbName
Vielleicht solltest du anfangen Variablen-Expansionen zu quoten. Ich wage zu behaupten, dass darin dein Problem liegen koennte. Weil sowas geht natuerlich nicht:

Code: Alles auswählen

a="foo * bar" 
a=$a.blubb
Use ed once in a while!

Antworten