在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)
归档时间: |
|
查看次数: |
685 次 |
最近记录: |