shell 中的 repr 等效项

shell 中的 repr 等效项

在Python中我使用:

repr('test')

获取输出:

"'test'"

我想做同样的事情,但是在 shell 中能够将该值存储在变量中。我能怎么做?

例如:如果我执行命令:

echo $test

我得到输出:

ghjghj "' bhj ""'' bjhv "''hjuhd

在 shell 中我想这样做:

test=repr(repr($test))

答案1

与 Python 类似的reprprintf %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}"
''\''"'\''<>\`'\''"'\'''\'''\''()*@@@@$$$$````'\'''\'''\'''\'''\'''

相关内容