In Python verwende ich:
repr('test')
um die Ausgabe zu erhalten:
"'test'"
Ich möchte dasselbe tun, aber in der Shell, um diesen Wert in einer Variablen speichern zu können. Wie kann ich das tun?
Beispiel: Wenn ich einen Befehl ausführe:
echo $test
Ich erhalte die Ausgabe:
ghjghj "' bhj ""'' bjhv "''hjuhd
In der Shell möchte ich Folgendes tun:
test=repr(repr($test))
Antwort1
Etwas Ähnliches wie bei Python repr
ist printf %q
, dass „which“ mit „which“ kombiniert werden könnte, printf -v
das in eine andere Variable statt in stdout „druckt“. (Obwohl es nicht standardmäßig ist, wird es im in Bash und Zsh integrierten printf unterstützt):
[prompt] foo=$(cat <<'EOT'
'"'<>\`'"'''()*@@@@$$$$````'''''
EOT
)
[prompt] printf '%q\n' "$foo"
\'\"\'\<\>\\\`\'\"\'\'\'\(\)\*@@@@\$\$\$\$\`\`\`\`\'\'\'\'\'
[prompt] printf -v bar %q "$foo"
Ein praktischer Einsatzzweck hierfür ist, wenn Sie Befehle über mehrere SSHs weitergeben möchten (z. B. wenn Sie die Weiterleitung auf Zwischenhosts nicht mit einrichten können ssh -J
) und sogareinsDer Grad der Flucht ist zu groß, um ihn im Auge behalten zu können (zumindest für mich):
[prompt] cmd='echo "$USER'\''s \$HOME on $HOSTNAME is $HOME"'
[prompt] ssh localhost "$cmd"
luser12's $HOME on kgbvax is /home/luser12
[prompt] printf -v cmd %q "$cmd"
[prompt] ssh localhost ssh localhost "$cmd"
luser12's $HOME on kgbvax is /home/luser12
[prompt] printf -v cmd %q "$cmd"
[prompt] printf -v cmd %q "$cmd"
[prompt] printf -v cmd %q "$cmd"
[prompt] echo "$cmd"
echo\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\$USER\\\\\\\\\\\\\\\'s\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$HOME\\\\\\\\\\\\\\\ on\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\$HOSTNAME\\\\\\\\\\\\\\\ is\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\$HOME\\\\\\\\\\\\\\\"
# OK, we're ready to go
[prompt] ssh localhost ssh localhost ssh localhost ssh localhost ssh localhost "$cmd"
luser12's $HOME on kgbvax is /home/luser12
Beachten Sie jedoch, dass das Anführungszeichen-Escape-Format printf %q
verwendet wird , das von der Remote-Shell möglicherweise nicht unterstützt wird.$'...'
(obwohl es von Bash, Zsh usw. unterstützt wird und angeblich in einer zukünftigen Version des POSIX-Standards enthalten sein soll).
Bash und ksh93 haben das auch typeset -p
(auch verwendbar wie declare -p
in Bash), aber es funktioniert nur mit Variablen, nicht mit Literalen:
[prompt] typeset -p foo
declare -- foo="'\"'<>\\\`'\"'''()*@@@@\$\$\$\$\`\`\`\`'''''"
[prompt]
Alternativ zu printf %q
gibt es in neueren Versionen der Bash auch die ${var@Q}
spezielle Erweiterungsform:
[bash] echo "${foo@Q}"
''\''"'\''<>\`'\''"'\'''\'''\''()*@@@@$$$$````'\'''\'''\'''\'''\'''