wie Shell-Skript-Befehl mit doppelten Anführungszeichen im Argumente laufen?
-
26-09-2019 - |
Frage
Ich brauche diesen Befehl auszuführen
psql -c "create database $var with encoding 'unicode';" -U edumate template1
aus dem Skript unter verschiedenen Benutzern. Die su Syntax ist su postre -c 'some command'
, so gibt es weitere Anführungszeichen erforderlich sind. Bitte beachten Sie auch, dass der psql Befehl $var
Variable nach innen hat.
so 'einige Befehle' = psql -c "create database $ var mit kodieren 'Unicode';" -U edumate template1
und ‚einige Befehl‘ muss auch in Anführungszeichen gesetzt werden (ich glaube)
Lösung
Es gibt einen Trick, den Sie jederzeit verwenden können, müssen Sie die Shell akzeptieren als ein einziges Argument, etwas zu haben, das sowohl einzelne und doppelte Anführungszeichen hat. Da die Schale lassen Sie nicht Anführungszeichen entkommen, müssen Sie es in mehrere anstoßenden Strings in Anführungszeichen drehen, zwischen einfachen und doppelten Anführungszeichen Schalt nach Bedarf zu schützen, was drin ist. Es ist hässlich, aber es funktioniert. Zum Beispiel hat
He said "It's done"
ein Argument sein, könnte man die drei Saiten stoßen:
'He said "It' - protect this substring with single quotes
"'" - protect this substring with double quotes
's done"' - protect this substring with single quotes
bekommen:
'He said "It'"'"'s done"'
In Ihrem Fall, das ein sehr hässlich geben würde:
su postre -c 'psql -c "create database '"$var with encoding 'unicode';"'" -U edumate template1'
Andere Tipps
Sie können versuchen sudo
statt su
z.
sudo psql -c "create database $var with encoding 'unicode';" -U edumate template1
(Hinweis: gut haben Getestet habe ich genau diesen Befehl wie ich Ich habe keine psql mit mir jetzt) ??
würde ich dies in einer Skriptdatei eingeben (geben Sie sie in einem Editor wie vi und sie in einer Datei speichern). Dann chmod + x und dann tun Sie Ihre su -c '<filename>'
Wenn Sie nicht in einer Datei gespeichert werden soll, dann werden Sie Ihre Anführungszeichen mit \"
oder \'
in Ihrem Befehl entkommen müssen je nachdem, welche Sie verwenden zitieren entscheiden mit su -c