쉘에서 백슬래시 처리

쉘에서 백슬래시 처리

다른 쉘에서 백슬래시를 echo처리하는 방법은 무엇입니까 ?printfzshbash

아래에다음과 같은 동작이 나타납니다.

$ echo "foo\bar\baz"
foaaz
$ echo "foo\\bar\\baz"
foaaz
$ echo 'foo\bar\baz'
foaaz
$ echo 'foo\\bar\\baz'
foo\bar\baz

아래에세게 때리다, 상황이 더 일관되게 보입니다.

bash$ echo "foo\bar\baz"
foo\bar\baz
bash$ echo 'foo\bar\baz'
foo\bar\baz
bash$

하지만 더 구체적으로 말하면:다음과 같은 백슬래시가 포함된 문자열을 전달하는 방법\\foo\bar\something도착하다:

  • echo
  • printf
  • print

똑같은 문자열을 얻으시겠습니까?(와 zsh함께 bash)?

다음은 zsh의 기능을 사용한 또 다른 실험입니다.

function foo
{
    echo -E '$1'
}

$ foo \\here\is\some\path
$1

어떻게 인쇄할 수 있나요 \\here\is\some\path?

업데이트 (참고: Stephen의 의견에서 답변되었습니다)

zsh 5.0.2에서 다음을 시도했습니다.

function foo
{
    printf '$s\n' $1 
}

foo '\\some\path'

하지만 이것은 출력됩니까 $s?

답변1

zsh echobashUNIX 모드와 마찬가지로 표준 모드에서 실행됩니다 . 즉, \bUNIX 사양에서 요구하는 대로 ASCII BS 문자로 확장됩니다.

echo임의의 문자열을 표시 하는 데 사용하지 말고 다음을 사용하십시오.printf:

printf '%s\n' "$1"

print -r -- "$1"또한 유효하지만 ksh/는 zsh구체적입니다.

echo -E - "$1"zsh나는 그것이 일부 BSD에서 작동한다고 믿습니다.

cat << EOF
$1
EOF

printfBourne과 같은 셸에서 작동합니다. 심지어 수십 년 전에는 명령이 없었던 셸에서도 작동 하지만 새로운 프로세스를 생성하고 printf현재 모든 곳에 있으므로 실제로는 필요하지 않습니다.

rc그런데 백슬래시는 쉘( python 을 제외한 모든 쉘 ) 에 특별하기 때문에 쉘 명령줄에서 이스케이프 처리해야 합니다 .

$ foo '\\foo\bar'

foo \\foo\bar누락된 백슬래시를 다시 만들 수 없는 "\foo\bar"문자열을 전달 합니다 .foo

답변2

새로운 답변: read -r var

-r  raw input - disables interpretion of backslash escapes and line-continuation in the read data

다음을 표시합니다.

printf "%s" "$var"
echo "$var"

작동해야합니다.

따라서 foo 기능의 경우:

function foo
{
    read -r var
    echo -E "var is : ${var}"
}

$ foo 
\\here\is\some\path
var is : \\here\is\some\path

아래의 이전 답변(답변은 아니지만 유용할 수도 있습니다 ^^)

각각을 교체하여 \\\에 " \내가 원하는 것입니다"라고 알리십시오. 그렇지 않으면(귀하의 예에서 zsh와 같이) \b"1 백스페이스" 등을 의미할 가능성이 높습니다.

예를 들어 sed를 사용할 수 있습니다.

sed -e 's,\\,\\\\,g' < the_original > the_escaped_backslaches_version

(여기서 어떻게 "\"를 이스케이프 처리해야 하는지 확인하고 sed에게 "내가 원하는 문자 그대로의 "\"입니다.) (Shell이 ​​대부분을 해석하지 않도록 " " 대신 ' '로 묶었습니다. 또한)

답변3

일반적으로 백슬래시 때문에 할 수 없습니다.이스케이프 문자(따라서 리터럴 값이 필요한 경우 이스케이프해야 함) BASH는 이러한 목적으로 작은따옴표를 제공하지만 작은따옴표로 묶인 문자열 내에서는 이스케이프된 작은따옴표를 사용할 수 없습니다.

차이점 은 echo내장되어 있으며 쉘에 따라 (어느 정도) 다르게 동작할 수 있다는 것입니다. 예를 들어 BASH 내장에는 -e백슬래시 시퀀스를 해석하도록 지시하는 옵션이 있습니다. 이를 사용하면 Z 쉘에서 볼 수 있는 동작을 얻을 수 있습니다.

관련 정보