백슬래시(\)와 함께 echo -e 사용

백슬래시(\)와 함께 echo -e 사용

나는 Unix의 echo 명령에 대해 읽고 있었고 \-e 옵션과 백슬래시( ) 이스케이프 문자에 대해 혼란스러워서 다음 두 가지 예를 실행했습니다.

echo "hello\\\\world"

산출:hello\\world

이제 -e를 사용하여 동일한 명령을 실행합니다.

echo -e "hello\\\\world"

산출:hello\world

그러면 옵션이 있거나 없는 백슬래시 문자의 의미는 무엇입니까 -e?

인사

답변1

Bash 큰따옴표 문자열에서는 백슬래시를 사용하여 다음 문자가 리터럴로 처리되도록 할 수 있습니다. 즉, 입력 매개변수는 "a\\b"다음을 통과합니다.리터럴 문자열 a\b명령에. 이것으로부터 우리는 두 경우 모두 hello\\world최종 인수로 전달하는 것이 에 echo전달되기 전에 각 백슬래시 쌍이 단일 리터럴 백슬래시로 확장된다는 결론을 내릴 수 있습니다 echo.

"다음 백슬래시 이스케이프 해석을 활성화"하도록 플래그를 지정합니다 -e(자세한 내용 참조). 단일 백슬래시에 대한 이스케이프 시퀀스로 나열되므로 이 경우 Bash는 원래 문자열에 대해 동일한 작업을 수행하고 두 개의 백슬래시를 하나로 줄입니다. 이 플래그는 주로 수평 탭이나 개행 문자와 같은 이스케이프 시퀀스를 포함하는 데 사용됩니다. 예를 들어:echohelp echo\\echo-e\t\n

$ echo -e 'first\tsecond\tthird'
first   second  third

대신 이것을 사용하는 것이 좋습니다 printf. 첫째, 형식 문자열을 사용한다는 것은 사용자가 제공한 문자열을 이스케이프 시퀀스와 안전하게 혼합할 수 있음을 의미합니다.

$ printf '%s\t%s\t%s\n' 'inject\nescape' '\\' '\evil'
inject\nescape  \\  \evil

둘째, 모든 버전이 echo이를 지원하는 것은 아니며 실수로 인용되지 않은 변수를 사용하면 사람들이 동작을 -e변경할 수 있습니다 .echo

$ injection='-e a\nb'
$ echo $injection
a
b

제삼:본 박사논문 수준의 분석.

그건 그렇고, Bash는 그렇습니다아니요작은따옴표로 묶인 문자열의 백슬래시를 이스케이프 문자로 처리하므로 다음과 같은 결과가 나타납니다.

$ echo 'hello\\\\world'
hello\\\\world
$ echo -e 'hello\\\\world'
hello\\world

관련 정보