![bash echo에서 "-E"를 인쇄하는 방법은 무엇입니까?](https://linux55.com/image/79697/bash%20echo%EC%97%90%EC%84%9C%20%22-E%22%EB%A5%BC%20%EC%9D%B8%EC%87%84%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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