변수의 탭이 작동하지 않습니다

변수의 탭이 작동하지 않습니다

나는 "Header"라는 메시지에 이 줄을 삽입했습니다.

header="
-------------------------------------
Name\tAge\tGender\tAddress
-------------------------------------
"

불행히도 \t예상대로 작동하지 않았습니다. 나는 심지어 \t그 사이 어딘가에 넣으려고 노력합니다 ``.

$header그런 다음 자동 이메일에 넣었습니다 .

mailx -s "$subject" -r "$from" "$to" <<-eof
$header

$body

$footer
eof
}

답변1

ANSI 문자열을 사용하는 경우:

header=$'
-------------------------------------
Name\tAge\tGender\tAddress
-------------------------------------
'

변수의 모든 ANSI 이스케이프 문자를 올바르게 번역했습니다. (참고: 개행 문자도 정의할 수 있지만 \n사례의 가독성이 높아지지는 않으므로 이 답변에 설명된 대로 원래 형식을 그대로 두겠습니다.)

사용되는 모든 곳에서 다른 도구를 사용하여 이를 변환하도록 할 수도 있습니다(문자열에 여전히 텍스트 표현이 포함되어 있음). 예를 들어 사용 echo -e(귀하의 버전이 echo해당 옵션을 지원하는 경우) 또는 변수를 다음과 같이 사용형식 문자열여기서 printf다음과 같은 이스케이프 문자도 해석됩니다 printf "$header".

토론: 사용은 printfPOSIX 표준이 된다는 장점이 있습니다. ANSI 문자열을 사용하면 변환이 항상 변수에 존재하며 추가 설명이 필요하지 않다는 장점이 있습니다.

(업데이트된 질문에서 알 수 있듯이) 변수는 mailx이스케이프 문자를 해석하지 않는 프로그램( )의 컨텍스트에서 사용되므로 변수에는 이미 적절한 형식이 포함되어 있어야 합니다.ANSI 문자열( ksh93AIX의 경우)가 적합한 솔루션인 것 같습니다. 표준을 준수하는 솔루션의 경우 재할당 변수 를 사용할 수도 있습니다 printf. 예를 들면 다음과 같습니다.header="..." ; header=$( printf "$header" )

답변2

다음을 사용하여 제목에 개행 문자를 추가합니다 \n.

header="---------------\n이름\t나이\t성별\ t 주소\n-----------------------\n"

그런 다음 예를 들어 다음을 echo -e $header표시합니다.

echo -e $header
-------------------------------------
Name    Age Gender  Address
-------------------------------------

그래도 작동하지 않으면 echo -e대신 사용하세요 printf. 출력이 대시로 시작하는 경우 printf -- "$header"호출은 printf전체 변수를 인수로 구문 분석하는 대신 출력으로 해석하도록 지시합니다.

더 많은 테스트를 거친 후 원래 변수는 printf에서도 작동합니다.

header="
-------------------------------------
Name\tAge\tGender\tAddress
-------------------------------------
"

printf -- "$header"

-------------------------------------
Name    Age     Gender  Address
-------------------------------------

이를 사용하려면 mailx다음을 사용할 수 있습니다.

mailx -s "$subject" -r "$from" "$to" <<eof
$header
$body
$footer
eof

답변3

또 다른 가능한 옵션은 awk를 사용하는 것입니다.

$ echo "Name Age Gender Address" | awk -F' ' '{ printf "%s\t%s\t%s\t%s\n", $1, $2, $3, $4 }'

생산하다:

Name    Age     Gender  Address

또는 printf를 직접 사용하십시오.

$ printf "%s\t%s\t%s\t%s\t\n" Name Age Gender Address

생산하다:

Name    Age     Gender  Address

답변4

~에서man echo

일반적으로 (이중 하이픈)을 사용하여 하이픈으로 시작하는 문자열과 플래그를 구별할 수 있습니다. echo 명령은 플래그를 지원하지 않으므로 문자 그대로 처리됩니다(이중 하이픈).

두 번째 예에서는 다음과 같습니다.

참고: 메시지에 이스케이프 시퀀스가 ​​포함된 경우 따옴표로 묶어야 합니다. 그렇지 않으면 쉘은 \(백슬래시)를 메타 문자로 해석하고 \를 다르게 처리합니다.

실제로 AIX에서는 다음과 같습니다.

~> header="
-------------------------------------
Name\tAge\tGender\tAddress
-------------------------------------
"

~> echo -e $header
-e ------------------------------------- Name   Age     Gender  Address -------------------------------------
~> echo "$header"

-------------------------------------
Name    Age     Gender  Address
-------------------------------------

관련 정보