In dieser Frage geht es nicht darum, wie ein ordnungsgemäß maskiertes Zeichenfolgenliteral geschrieben wird. Ich konnte keine verwandte Frage finden, bei der es nicht darum geht, Variablen für den direkten Verbrauch innerhalb eines Skripts oder durch andere Programme zu entziehen.
Mein Ziel ist es, ein Skript zu ermöglichen, andere Skripte zu generieren. Dies liegt daran, dass die Tasks in den generierten Skripten auf einem anderen Computer zwischen 0 und n Mal ausgeführt werden und sich die Daten, aus denen sie generiert werden, möglicherweise ändern, bevor sie (erneut) ausgeführt werden, sodass die Vorgänge direkt über ein Netzwerk ausgeführt werden nicht arbeiten.
Bei einer bekannten Variablen, die Sonderzeichen wie einfache Anführungszeichen enthalten kann, muss diese als vollständig maskiertes Zeichenfolgenliteral ausgegeben werden. Eine Variable, die beispielsweise Folgendes foo
enthält, bar'baz
sollte im generierten Skript folgendermaßen aussehen:
qux='bar'\''baz'
Das würde durch Anhängen "qux=$foo_esc"
an die anderen Zeilen der Schrift geschrieben werden. Ich habe es mit Perl so gemacht:
foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'"
aber das scheint übertrieben.
Ich habe keinen Erfolg damit gehabt, es mit Bash alleine zu tun. Ich habe viele Variationen davon ausprobiert:
foo_esc="'${file//\'/\'\\\'\'}'"
foo_esc="'${file//\'/'\\''}'"
Aber entweder erscheinen zusätzliche Schrägstriche in der Ausgabe (wenn ich das tue echo "$foo"
) oder sie verursachen einen Syntaxfehler (weitere Eingaben werden von der Shell erwartet).
alias "varname=$varname" varname
odervar=value set
alias
und / oderset
ziemlich universell