쉘에서 동등한 표현

쉘에서 동등한 표현

Python에서는 다음을 사용합니다.

repr('test')

출력을 얻으십시오 :

"'test'"

나도 똑같은 일을 하고 싶지만 셸에서는 값을 변수에 저장할 수 있습니다. 어떡해?

예를 들어 다음 명령을 실행하면 다음과 같습니다.

echo $test

나는 출력을 얻습니다 :

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

쉘에서는 다음을 수행하고 싶습니다.

test=repr(repr($test))

답변1

Python 과 유사하게 repr이는 stdout 대신 다른 변수로 "인쇄"하는 것과 결합 printf %q될 수 있습니다. printf -v(표준은 아니지만 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사용합니다.$'...'(비록 bash, zsh 등에서 지원되며 POSIX 표준의 향후 버전에 포함될 것으로 예상됩니다.)


Bash와 ksh93에도 이 기능이 있지만 typeset -p(bash처럼 사용할 수도 있음 declare -p) 리터럴이 아닌 변수에서만 작동합니다.

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

대안으로 printf %q최신 버전의 bash에는 ${var@Q}특별한 확장 형식도 있습니다.

[bash] echo "${foo@Q}"
''\''"'\''<>\`'\''"'\'''\'''\''()*@@@@$$$$````'\'''\'''\'''\'''\'''

관련 정보