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

相關內容