shell 中的 repr 等效项

Ric*_*rca 2 shell bash python

在Python中我使用:

repr('test')
Run Code Online (Sandbox Code Playgroud)

获取输出:

"'test'"
Run Code Online (Sandbox Code Playgroud)

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

例如:如果我执行命令:

echo $test
Run Code Online (Sandbox Code Playgroud)

我得到输出:

ghjghj "' bhj ""'' bjhv "''hjuhd
Run Code Online (Sandbox Code Playgroud)

在 shell 中我想这样做:

test=repr(repr($test))
Run Code Online (Sandbox Code Playgroud)

小智 5

与 Python 类似的repr是,它可以与“打印”到另一个变量而不是 stdoutprintf %q结合起来。printf -v(虽然不是标准的,但 bash 和 zsh 内置的 printf 支持它):

[prompt] foo=$(cat <<'EOT'
'"'<>\`'"'''()*@@@@$$$$````'''''
EOT
)
[prompt] printf '%q\n' "$foo"
\'\"\'\<\>\\\`\'\"\'\'\'\(\)\*@@@@\$\$\$\$\`\`\`\`\'\'\'\'\'
[prompt] printf -v bar %q "$foo"
Run Code Online (Sandbox Code Playgroud)

其一个实际用途是当您想要通过多个 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
Run Code Online (Sandbox Code Playgroud)

但请注意,这printf %q将使用$'...'引号转义格式,远程 shell 可能不支持该格式(尽管 bash、zsh 等支持该格式,并且预计将包含在 POSIX 标准的未来版本中)。


Bash 和 ksh93 也有typeset -p(也可以像declare -p在 bash 中一样使用),但它只适用于变量,不适用于文字:

[prompt] typeset -p foo
declare -- foo="'\"'<>\\\`'\"'''()*@@@@\$\$\$\$\`\`\`\`'''''"
[prompt]
Run Code Online (Sandbox Code Playgroud)

作为 的替代方案printf %q,较新版本的 bash 还具有${var@Q}特殊的扩展形式:

[bash] echo "${foo@Q}"
''\''"'\''<>\`'\''"'\'''\'''\''()*@@@@$$$$````'\'''\'''\'''\'''\'''
Run Code Online (Sandbox Code Playgroud)