여기 문서를 사용하여 Bash 스크립트에서 스크립트를 생성하세요. 내 변수가 대체되는 이유는 무엇입니까?

여기 문서를 사용하여 Bash 스크립트에서 스크립트를 생성하세요. 내 변수가 대체되는 이유는 무엇입니까?

기본 스크립트에서 스크립트를 생성하는 데 문제가 있습니다.

매우 간단합니다:

cat  pippo << EOF
LOGFILE=test.log    
echo '#############################' >> $LOGFILE
EOF

. 그러나 pippo를 확인하면 다음과 같은 결과가 나타납니다.

LOGFILE=test.log
echo '#############################' >>
EOF

$LOGFILE이 대체된 이유는 무엇입니까?

답변1

기본적으로 여기에 있는 문서는 쉘 확장, 정확한 인수 확장, 명령 대체 및 산술 확장의 영향을 받습니다. 따라서 귀하의 경우 변수(인수) 확장이 발생합니다. 변수는 LOGFILE현재 셸에서 확장되고 있으며 변수가 존재하지 않을 수 있으므로 확장된 값으로 null이 반환(및 대체)됩니다.

여기에 설명된 대로 문자 그대로 셸 메타 문자를 얻으려면 종결자 문자열 주위에 따옴표를 사용하십시오.

cat pippo <<'EOF'  ## "EOF" would do too
LOGFILE=test.log    
echo '#############################' >>"$LOGFILE"
EOF

또한 변수 확장을 인용하십시오. (아마도) 파일 ​​이름을 참조하므로 확장 후에는 토큰화되지 않고 경로 이름이 확장되지 않습니다.

답변2

실제로 pippo파일을 소유하려면 다음을 수행해야 합니다.

cat > pippo <<EOF

여기 문서의 값을 pippo.

그런 다음 이 문서의 내용을 확장, 평가 또는 변경하지 않고 작성된 대로 정확하게 전송하려면 다음 중 하나를 인용해야 합니다 (부분 인용도 가능) <<.

<<'EOF'
<<"EOF"
<<\EOF
<<E"O"F
<<E\OF

참조가 없으면 변수 값이 "$LOGFILE"해당 값(사용자 환경에서 null로 표시됨)으로 확장되어 손실됩니다.

간단히 말해서 다음과 같이 사용하십시오.

cat > pippo << \_EOF_
LOGFILE=test.log    
echo '#############################' >> $LOGFILE
_EOF_

관련 정보