在Python中我使用:
repr('test')
获取输出:
"'test'"
我想做同样的事情,但是在 shell 中能够将该值存储在变量中。我能怎么做?
例如:如果我执行命令:
echo $test
我得到输出:
ghjghj "' bhj ""'' bjhv "''hjuhd
在 shell 中我想这样做:
test=repr(repr($test))
答案1
与 Python 类似的repr
是printf %q
,它可以与printf -v
“打印”到另一个变量而不是 stdout 结合起来。 (虽然不是标准的,但 bash 和 zsh 内置的 printf 支持它):
[prompt] foo=$(cat <<'EOT'
'"'<>\`'"'''()*@@@@$$$$````'''''
EOT
)
[prompt] printf '%q\n' "$foo"
\'\"\'\<\>\\\`\'\"\'\'\'\(\)\*@@@@\$\$\$\$\`\`\`\`\'\'\'\'\'
[prompt] printf -v bar %q "$foo"
其实际用途之一是当您想要通过多个 ssh 传递命令时(例如,当您无法使用 来设置中间主机上的转发时ssh -J
),甚至一转义级别太多而无法跟踪(至少对我来说):
[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
但请注意,这printf %q
将使用$'...'
引号转义格式,远程 shell 可能不支持该格式(尽管它受到 bash、zsh 等的支持,并且预计将包含在 POSIX 标准的未来版本中)。
Bash 和 ksh93 也有typeset -p
(也可以像declare -p
在 bash 中一样使用),但它只适用于变量,不适用于文字:
[prompt] typeset -p foo
declare -- foo="'\"'<>\\\`'\"'''()*@@@@\$\$\$\$\`\`\`\`'''''"
[prompt]
作为 的替代方案printf %q
,较新版本的 bash 还具有${var@Q}
特殊的扩展形式:
[bash] echo "${foo@Q}"
''\''"'\''<>\`'\''"'\'''\'''\''()*@@@@$$$$````'\'''\'''\'''\'''\'''