u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE
Ich möchte den resultierenden Befehl einfach (z. B. wenn möglich ohne Escape) drucken, anstatt ihn auszuführen.
Gibt es eine integrierte Funktion, um diese Art von Tests in Standard-Linux-Shells wie Bash durchzuführen?
Antwort1
Um den allgemeinen Fall abzudecken, müssen Sie Variablen in Anführungszeichen setzen und den Befehl als Array speichern:
$ USER='foo bar' DATABASE='baz ban'
$ command=(u2api --zuser="$USER" --outfmtput=json SQL create_database name="$DATABASE")
$ printf '%q ' "${command[@]}"; echo # To get a newline at the end
u2api --zuser=foo\ bar --outfmtput=json SQL create_database name=baz\ ban
So führen Sie das Befehlsarray aus:
"${command[@]}"
echo
Die Ausführung des Befehls funktioniert in einigen sehr einfachen Fällen:
echo u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE
Dies ist die einfachste Lösung, zeigt Ihnen aber nur dann die korrekte Ausgabe, wenn die Erweiterungen keine Sonderzeichen wie Leerzeichen (insbesondere Leerzeichen, Tabulatoren oder Zeilenumbrüche) oder Escape-Zeichen enthalten. Beispiel:
$ USER='foo bar'
$ echo u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE
u2api --zuser=foo bar --outfmtput=json SQL create_database name=
Beachten Sie die fehlenden Anführungszeichen um den Benutzernamen. Dasselbe Problem tritt bei allen nicht in Anführungszeichen gesetzten Variablen auf, die Leerzeichen enthalten.