bash 스크립트의 에코 탭 문자


313

bash 스크립트를 사용하여 하나 이상의 탭 문자를 에코하는 방법은 무엇입니까? 이 코드를 실행할 때

res='       'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]

나는 이것을 얻는다

res=[ x] # that is [<space>x]

답변:


529
echo -e ' \t '

'space tab space newline'을 에코합니다 ( ' -e백 슬래시 이스케이프 해석 가능'을 의미합니다).

$ echo -e ' \t ' | hexdump -C
00000000  20 09 20 0a                                       | . .|

고마워요 이 해결책을 찾도록 도와주었습니다. res = '\ t \ t'x; echo -e '['$ res ']'
kalyanji

2
echo -eMakefile에서 작동하지 않는지 알고 있습니까?
dma_k

23
echo -ePOSIX가 아니기 때문에 일반적으로 프로그램에서 사용하지 않는 make호출 /bin/sh은 대화식으로 사용되며 일반적으로 -e구현 되지 않았습니다 . 이식성을 위해 printf '\t'대신 사용하십시오.
Jo So

Darwin (macOS) man에서 echo명령 페이지 에는 옵션이 언급되어 있지 않습니다 -e. 그러나이 옵션은 허용됩니다.
ePi272314

75

사용 printf하지 말고 사용하십시오 echo.

여러 버전의 echo명령이 있습니다. 있다 /bin/echo(이 수도 있고 시스템에 따라 GNU로 coreutils 버전이 아닐 수도있다), 그리고 echo명령은 대부분 껍질에 내장되어 있습니다. 버전마다 제어 문자의 이스케이프를 지정하거나 비활성화하는 방법이 다릅니다 (또는 방법이 없습니다).

printf반면에 변형은 훨씬 적습니다. 일반적으로 명령으로 존재할 수 있으며 /bin/printf일부 쉘에 내장되어 있지만 (bash 및 zsh에는 tcsh 및 ksh에는 없습니다) 다양한 버전은 서로 다른 버전보다 서로 훨씬 유사합니다 echo. 그리고 당신은 명령 줄 옵션을 기억할 필요가 없습니다 (몇 가지 예외를 제외하고, GNU로 coreutils의 printf는 허용 --version하고 --help, 그리고 내장의 bash의 printf 받아 -v var변수에 출력을 저장하기 위해).

예를 들어 :

res='           'x # res = "\t\tx"
printf '%s\n' "[$res]"

그리고 이제 echo여러분이 요구하는 예제에서도 잘 작동 한다는 것을 인정할 때 입니다. 인수에 큰 따옴표를 넣으면됩니다.

echo "[$res]"

kmkaplan이 쓴 것처럼 (2 년 반 전에 방금 주목했습니다!). 원래 명령의 문제점 :

res='           'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]

와 함께하지 않습니다 echo; 그것은 껍질이 탭을 전에 echo본 공간으로 교체 했기 때문입니다.

echo와 같은 간단한 출력에는 적합 echo hello world하지만 printf더 복잡한 것을 원할 때마다 사용해야합니다 . 당신은 할 수 얻을 echo작업에 있지만 결과 코드는 다른 그것을 실행하면 실패 할 가능성이 echo구현하거나 다른 쉘.


1
나는 이것을 좋아했고 printf와 모든 형식 지정자에 대한 지식을 사용할 수 있습니다.
Arun

@JezenThomas : 요청 된 것과 다른 방식으로 질문에 대답하기 때문에 더 많이지지되지 않습니다. 질문은 구체적으로 echo를 언급하고 echo는 동사가 아니라 명령입니다.
Paulo Neves

@PauloNeves : 질문에서 동사로 사용되었다고 말하고 싶습니다. " bash 스크립트를 사용하여 하나 이상의 탭 문자를 어떻게 에코 합니까?"
Keith Thompson

34

따옴표 사이에 문자열을 넣으 십시오.

echo "[$res]"

1
여기에서도 마찬가지입니다-이것이 제가 먼저 시도한 것입니다. -e하지만 벌금을 일
froderik

2
@kmkaplan zsh에서 나를 위해 일합니다-bash에서 나를 위해 실패
Kal

34

시도해 볼 수도 있습니다 :

echo Hello$'\t'world.

4
보다 일반적인 솔루션의 경우 +1 나는 몇 년 동안 배쉬를 사용해 왔으며 지금 막 이것을 배웠다!
Aryeh Leib Taurog

에코없이 사용할 수 있으므로 허용되는 답변보다 훨씬 일반적입니다.
jwan

22

echo에 -e 플래그를 사용해야합니다.

echo -e "\t\t x"

16

bash 매뉴얼 페이지에서 :

$ 'string'형식의 단어는 특별히 취급됩니다. ANSI C 표준에 지정된대로 백 슬래시 이스케이프 문자를 바꾸어 단어를 문자열로 확장합니다.

그래서 당신은 이것을 할 수 있습니다 :

echo $'hello\tworld'

왜 이것이 CLI에서 작동하지만 bash 스크립트에서는 작동하지 않습니까?
Freek

13

는 그대로 키 사용 ^V( CTRL+V, C-v, 무엇이든 ).

당신이 입력 할 때 ^V터미널 (또는 대부분의 유닉스 편집기에서)에 다음과 같은 문자가 취해진 다 그대로 . 이것을 사용하여 에코하는 문자열 안에 리터럴 탭 문자를 입력 할 수 있습니다.

다음과 같은 것이 작동합니다.

echo "^V<tab>"     # CTRL+V, TAB

배쉬 문서 ( qv , "quoted-insert")

quoted-insert (Cq, Cv) 입력 한 다음 문자를 그대로 사용하십시오. 예를 들어 Cq와 같은 키 시퀀스를 삽입하는 방법입니다.

참고 사항 : 이것에 따르면 ALT+TAB 똑같은 일을해야하지만 우리는 시퀀스를 창 전환에 바인딩하여 사용할 수 없습니다

탭 삽입 (M-TAB) 탭 문자를 삽입하십시오.

-

참고 :이 전략을 모든 종류의 특이한 문자와 함께 사용할 수 있습니다. 캐리지 리턴과 같이 :

echo "^V^M"        # CTRL+V, CTRL+M

캐리지 리턴은 ASCII 13이고 M 은 알파벳의 13 번째 문자이므로을 입력 ^M하면 13 번째 ASCII 문자를 얻게됩니다. ls^M빈 프롬프트 에서을 사용하여 작동 상태를 확인할 수 있으며 캐리지 리턴이 삽입되어 리턴을 누르는 것처럼 프롬프트가 작동합니다. 이러한 문자는 일반적으로 해석하는 경우, 그대로 당신이 리터럴 문자를 얻을 가져옵니다.


1
이것에 대해 더 많은 투표를 해줄 수 있기를 바랍니다. 이 경우 내 주장에 -e를 사용하고 싶지 않았으며 이것이 효과적입니다. 감사!
Aaron R.

"... 대부분의 유닉스 편집자"? vi와 emacs로 이것을 입력하려고 시도했지만 원하는 결과를 얻지 못했습니다.
GreenMatt

정말 멋져요! 그리고 문자가 grep포함 된 줄을 잡는 데 사용할 때 하루를 절약했습니다 tab.
Joël

11

echo를 사용하여 변수 값을 인쇄하는 것이 일반적인 Bash 함정입니다. 참조 링크 :

http://mywiki.wooledge.org/BashPitfalls#echo_.24foo


쿨, 나는 "BashPitfalls", 재료의 위대한 조각을 좋아하고 내 일상 업무에서 많은 고통을 완화!
Jerry Tian

+1이기 때문에 +1입니다. 그러나 칼 얀지 문자열은 "["로 시작하며 "\"를 포함하지 않습니다.
kmkaplan

2

echo "a\tb"스크립트에서 사용하려면 다음 과 같이 스크립트를 실행하십시오.

# sh -e myscript.sh

또는 myscript.sh에 실행 권한을 부여한 다음 스크립트를 실행할 수 있습니다.

# chmod +x myscript.sh
# ./myscript.sh

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.