在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}"
''\''"'\''<>\`'\''"'\'''\'''\''()*@@@@$$$$````'\'''\'''\'''\'''\'''