bash echo에서 "-E"를 인쇄하는 방법은 무엇입니까?

bash echo에서 "-E"를 인쇄하는 방법은 무엇입니까?

echo를 실행하고 다음과 같은 출력을 얻고 싶습니다.

$ export EVAR="-E"
$ echo "$EVAR"
-E

예를 들어 bash 변수에 "-E"를 저장했습니다 $EVAR. echo를 실행하면 echo $EVAR아무것도 인쇄되지 않습니다. 어쩌면 $EVAR가 -E 매개변수라고 생각할 수도 있습니다. 큰따옴표 안에 인용하는 것도 $EVAR작동하지 않습니다.

어떻게 인쇄할 수 있나요?

노트$EVAR: $EVAR 의 내용을 이해하지 못하고 $EVAR 의 내용을 분석하지 않는 솔루션이 있을 수 있다고 생각했습니다 echo some-arg $EVAR. 가능합니까? 아니면 이와 같은 해결 방법을 사용해야 합니까 printf?

답변1

다음과 같은 트릭을 사용할 수 있습니다.

echo " $EVAR"
echo  -e "\055E"
echo $'\055E'

하지만 내가 말했듯이 이것은 속임수입니다. 실제 해결책은 항상 printf를 사용하는 것입니다.

$ printf '%s\n' "$EVAR"
-E

답변2

요청한 대로 출력 앞에 빈 줄이 있어도 괜찮다면 명령줄에서 이 솔루션을 직접 테스트하세요.

$ export EVAR="-E"
$ echo -e "\n$EVAR"

-E
  • 원본은 echo "$EVAR"아무것도 제공하지 않습니다. 왜냐하면 의심한 대로 명령 -E에 대해 허용되는 옵션으로 간주되기 때문입니다 echo. .. man echo는 다음과 같이 말합니다. -E disable interpretation of backslash escapes (default)
  • 따라서 공백 문자를 앞에 추가합니다. 이 경우 새 줄
  • 하지만 직접 사용할 수는 없으므로 해석을 "\n"사용하세요 .-e"\n"
  • 물론 이는 원본 콘텐츠가 아직 남아 있는 경우 $EVAR출력에서 ​​지금 소개한 첫 번째 빈 줄을 제거하기 위해 다른 작업을 수행해야 함을 의미합니다.

답변3

printf앞에서 언급한 대로 사용하거나 shopt xpg_echo이를 활성화하면폐쇄표준까지 echo:

echo 'hi\nthere'

hi
there

-E하지만 여전히 매개변수를 올바르게 처리 하지 못합니다 . 따라서 다음과 같이 자신만의 작은 준수 표준을 작성할 수 있습니다 echo.

echo()
    case  ${IFS- }  in
    (\ *) printf %b\\n "$*";;
    (*)   IFS=\ $IFS
          printf %b\\n "$*"
          IFS=${IFS#?}
    esac

...나중에 올게요최대echo모든 측면에서 단일 Unix 사양을 준수합니다.( a 또한 8진수를 bash printf처리할 때 표준을 위반하는 것을 제외하고)\[num]{1,3}%b.

...그래서...

echo -E

-E

답변4

printf대신 사용할 수 있습니다 echo.

$ EVAR="-E"
$ printf "%s\n" ${EVAR}
-E

관련 정보