Forum: PC-Programmierung ShellScript Variablen in Commands


von Alexander Becker (Gast)


Lesenswert?

Hi

hab ein kleines Problem auf das bestimmt viele eine Lösung haben 
könnten.

ICh möchte eine Varibale einlesen und diese dann mit einem Befehl 
ausführen.
Leider klappt das ganze nicht so wie ich es mir gedacht habe.

Hoffe das mir jemand einen Stoß in die richtige Richtung geben kann.
1
function process_create_database()
2
{
3
  
4
  echo "Create Database"
5
  echo "----------------------------------------"
6
  echo "Databasename :" 
7
  read -r databasename
8
  echo "Duration: "
9
  read duration
10
  
11
  
12
  if [ "$duration" == "" ];
13
  then
14
        
15
  influx -execute 'create database $databasename'
16
  echo "Datenbank wurde erstellt"

Hier wird folgender Fehler geworfen:

ERR: error parsing query: found $database, expected identifier at line 
1, char 17
Warning: It is possible this error is due to not setting a database.
Please set a database with the command "use <database>".
1
  if [ "$duration" == "" ];
2
  then
3
        string="'CREATE DATABASE $databasename'"
4
   influx -execute $string
Bei dieser Variante erhlate ich:

unknown arguments: database a'
Usage of influx:
-execute 'command'
       Execute command and quit.
1
  if [ "$duration" == "" ];
2
  then
3
        string="'CREATE DATABASE $databasename'"
4
   influx -execute "$string"

Und hier haben wir diese tolle Meldung

ERR: error parsing query: found CREATE DATABASE a, expected SELECT, 
DELETE, SHOW, CREATE, DROP, EXPLAIN, GRANT, REVOKE, ALTER, SET, KILL at 
line 1, char 1
Warning: It is possible this error is due to not setting a database.
Please set a database with the command "use <database>".


kann mir jemand sagen wie ich die Variabele in den execute Befehl 
eingebeunden bekomme?

Freu mich schon auf Antworten

von devzero (Gast)


Lesenswert?

Alexander Becker schrieb:
> Hoffe das mir jemand einen Stoß in die richtige Richtung geben kann.

man eval

von Yalu X. (yalu) (Moderator)


Lesenswert?

In

1
  influx -execute 'create database $databasename'

musst du die Apostrophe (') durch Anführungszeichen (") ersetzen, damit
$databasename expandiert wird:

1
  influx -execute "create database $databasename"

Sonst wird versucht, eine Datenbank namens $databasename zu kreieren,
was aber wegen des $-Zeichens kein gültiger Identifier ist.

1
        string="'CREATE DATABASE $databasename'"
2
   influx -execute "$string"

Hier wird versucht das Kommando 'CREATE statt CREATE auszuführen. Lass
die Apostrophe weg, dann funktioniert auch das:

1
   string="CREATE DATABASE $databasename"
2
   influx -execute "$string"

: Bearbeitet durch Moderator
von devzero (Gast)


Lesenswert?

Ich sehe da kein '' alleine - "''" ist ok und da wird auch expandiert 
(zumindestens in der Bash)

von Yalu X. (yalu) (Moderator)


Lesenswert?

devzero schrieb:
> Ich sehe da kein '' alleine - "''" ist ok und da wird auch expandiert

Egal, ob da das Apostroph alleine oder zu zweit oder zu dritt auftaucht:
Es stört, weil es den Influx-Interpreter verwirrt. Dieser möchte bspw.

1
CREATE DATABASE a

sehen, nicht aber

1
'CREATE DATABASE a'

Ich habe mich in meinem obigen Beitrag allerdings darin geirrt, wie
Influx diese Zeile falsch interpretiert, weil ich nicht gewusst habe,
dass auch in der Influx-Syntax die Apostrophe zur Zusammenfassung
mehrerer (durch Whitespace getrennter) Wörter zu einem Token benutzt
werden. Damit heißt das erste Token des Kommandos nicht, wie von mir
angenommen,

1
'CREATE

sondern

1
CREATE DATABASE a

was aber genauso falsch ist.

Damit ist auch die – zunächst recht komisch erscheinende – Fehlermeldung
nachvollziehbar:

1
ERR: error parsing query: found CREATE DATABASE a, expected SELECT, 
2
DELETE, SHOW, CREATE, DROP, EXPLAIN, GRANT, REVOKE, ALTER, SET, KILL at 
3
line 1, char 1

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.