나는 "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"
.
토론: 사용은 printf
POSIX 표준이 된다는 장점이 있습니다. ANSI 문자열을 사용하면 변환이 항상 변수에 존재하며 추가 설명이 필요하지 않다는 장점이 있습니다.
(업데이트된 질문에서 알 수 있듯이) 변수는 mailx
이스케이프 문자를 해석하지 않는 프로그램( )의 컨텍스트에서 사용되므로 변수에는 이미 적절한 형식이 포함되어 있어야 합니다.ANSI 문자열( ksh93
AIX의 경우)가 적합한 솔루션인 것 같습니다. 표준을 준수하는 솔루션의 경우 재할당 변수 를 사용할 수도 있습니다 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
-------------------------------------