2009-07-10 8 views
0

Wie schließe ich eine Zeichenfolge mit einem Ausdruck in einen Befehl in einem Bash-Skript ein?Einschließlich String-Ausdrücke in Bash-Befehle

Beachten Sie Folgendes:

#!/bin/bash 
exclusions='Database|information_schema|mysql' 
echo "mysql -e 'SHOW DATABASES' | grep -E -v '$exclusions' > outfile" 
mysql -e 'SHOW DATABASES' | grep -E -v '$exclusions' > outfile 

Das Skript druckt auf dem Bildschirm:

mysql -e 'SHOW DATABASES' | grep -E -v 'Database|information_schema|mysql' > outfile 

... also denke ich, meine Syntax, um die Befehlsfolge produziert ich will. Und wenn ich die gedruckte Zeichenfolge manuell in die Befehlszeile eingabe, werden mit dem Befehl alle Datenbanknamen außer denen im grep-Ausdruck in 'outfile' geschrieben.

Das Skript exportiert jedoch alle Datenbanknamen in die Datei, ohne die Namen im grep-Ausdruck auszuschließen. Warum übersieht das Skript den Grep-Ausdruck?

Antwort

3

Umgebungsvariablen (und andere Sonderzeichen) werden in Strings mit einfachen Anführungszeichen nicht erweitert. Der eine in der echo-Anweisung ist, weil die Zeichenfolge selbst durch doppelte Anführungszeichen begrenzt wird. Die einfachen Anführungszeichen in dieser Zeichenfolge sind Teil der Zeichenfolge, nicht die Trennzeichen.

Sehen Sie, was die bash manual über Zitate sagt.

2

Verwenden Sie doppelte Anführungszeichen anstelle von einfachen Anführungszeichen.

mysql -e 'SHOW DATABASES' | grep -E -v "$exclusions" > outfile