'EOF'로 설명되지 않은 변수

'EOF'로 설명되지 않은 변수

이것은 내 스크립트입니다.

var="lalallalal"
tee file.tex <<'EOF'
text \\ text \\
$var
EOF

"EOF"(따옴표 포함)를 사용해야 합니다. 그렇지 않으면 이중 슬래시( )를 사용할 수 없기 때문입니다 //.

그러나 따옴표를 사용하면 $var변수가 확장되지 않습니다.

답변1

발견한 대로 EOF변수를 인용하면 변수가 확장되지 않습니다. 이에 대한 내용은 다음 문서 섹션에 설명되어 있습니다 man bash.

   No parameter and variable expansion, command  substitution,  arithmetic
   expansion,  or pathname expansion is performed on word.  If any part of
   word is quoted, the delimiter is the result of quote removal  on  word,
   and  the  lines  in  the  here-document  are  not expanded.  If word is
   unquoted, all lines of the here-document  are  subjected  to  parameter
   expansion,  command substitution, and arithmetic expansion, the charac‐
   ter sequence \<newline> is ignored, and \ must be  used  to  quote  the
   characters \, $, and `.

거기에 설명된 또 다른 점은 을 계속 사용할 수 있다는 것입니다. \단지 이스케이프하면 됩니다: \\. 따라서 둘 다 원하므로 \각각을 이스케이프 처리해야 합니다 \\\\. 이 모든 것을 종합하면 다음과 같습니다.

#!/bin/bash
var="lalallalal"
tee file.tex <<EOF
text \\\\ text \\\\
$var
EOF

답변2

$문서의 일부 또는 특정 특수 문자( 예, 아니요) 에 대해서만 확장을 활성화하려는 것 같습니다 \. 첫 번째 경우에는 이 문서를 두 부분으로 나누고 싶을 수도 있고, 두 번째 경우에는 비표준 접근 방식을 제안하겠습니다. 이를 \변수로 처리합니다.

var="lalallalal"
bs='\';                       #backslash
tee file.tex <<EOF
text $bs$bs text $bs$bs
$var
EOF

답변3

한 가지 옵션은 문자열을 생성한 후 간단히 변수를 바꾸는 것입니다. 나는 이것이 수동 변수 확장이라는 것을 알고 있지만 해결책입니다.

# Set variables
var="lalallalal"
read -rd '' tex_data <<'EOF'
text \\ text \\
${var}
EOF

# Expand variable
tex_data="${tex_data//\$\{var\}/$var}"
printf "%s" "$tex_data" | tee file.tex

관련 정보