2016-08-25 3 views
0

Ich schreibe einen Bash One Liner. Dies funktioniert (Drucke auf der Konsole stammen oder versucht, sie auszuführen):Bash: entweichen Variablen

-bash-4.1$ DATE=`$(date --date="2 days ago" +%F)` echo "${DATE}" 

Aber:

`DATE=$(date --date="2 days ago" +%F)` psql -d some_db -c "select row from table where started >= '${DATE}' and started < ('${DATE}'::date + '1 day'::interval);" 

Gibt:

ERROR: invalid input syntax for type timestamp: "" 
LINE 1: ... table where started >= '' ... 

was bedeutet, dass ${DATE} es leer ist. Was muss ich ändern, damit es funktioniert?

+1

W hy mixst du '$ (...)' und dann alte Back-Ticks in demselben Befehl? – anubhava

+0

Ja, aber zumindest weiß es über den Namen, es ist eindeutig keine leere Zeichenfolge im ersten Beispiel. – mnowotka

+1

Ihre erste Zeile wird 'bash: 2016-08-23: Befehl nicht gefunden' Fehler. Es sollte sein: 'DATE = $ (date - date =" vor 2 Tagen "'+% F') && echo" $ DATE "' – anubhava

Antwort

1

Der erste Befehl ist aus mehreren Gründen gebrochen. Zunächst mischen Sie Backticks und $() so, dass Sie die Ausgabe des Befehls date so ausführen, als wäre es der Name eines anderen Befehls.

Um die Ausgabe eines Befehls in einer Variablen zu speichern, verwenden Sie folgende Syntax:

output=$(command) 

Zweitens würde die Variable von der Shell erweitert werden, bevor er ein Wert zugewiesen worden war, so dass Sie bis spalten müssen der Befehl in zwei Anweisungen:

date=$(date_command); psql -c "select ... '$date'" 

... oder einen Befehl Substitution direkt verwenden:

psql -c "select ... '$(date_command)" 
1

Warum ist das Datum in Bash Mathe? PG kann es direkt tun:

SELECT ... WHERE started >= (datefield - interval '2 day') 
             ^^^^^^^^^^^^^^^^^ 
+0

Vielen Dank für diese Antwort. Die Frage war, wie man es in bash macht. Bitte abstrahiere die Tatsache, dass dies PG ist, es kann ein anderer Befehl sein, wo du das Datum verwenden musst. – mnowotka