다음 코드를 고려해보세요.
for domain; do
cat << EOF > "/etc/nginx/sites-available/${domain}.conf"
My \domain is ${domain}.
EOF
done
경로는 /etc/nginx/sites-available/${domain}.conf
따옴표로 묶여 있습니다. 이것이 모범 사례입니까, 아니면 변수 대체 때문에 수행된 것입니까? 변수 대체인 경우 EOF
구분 기호 이름( )을 래핑하는 것이 더 낫거나 더 일반적이지 않습니까?
답변1
포함하는 변수를 참조하는 표현식은 다음과 같습니다.모범 사례(단순한 사람이 되는 것보다관습) 부분왜냐하면변수 확장:
예를 들어 변수가 공백이 포함된 문자열로 확장되면 코드가 잘못된 파일에 기록됩니다. heredoc 키워드를 인용하면 변수 확장에 영향을 주지만 인용이 문자열에 영향을 미치는 것과 같은 방식은 아닙니다.
특히 heredoc 키워드를 인용하면 변수 확장이 방지됩니다.
어쨌든 문제의 경로는 heredoc 본문의 일부가 아닙니다(라인에서 시작).뒤쪽에따라서 첫 번째 구분 기호)는 영향을 받지 않습니다. 독립적으로 인용해야 합니다.
또한 귀하의 질문과 관련이 없더라도 코드 조각의 heredoc는 닫는 구분 기호가 들여쓰기되어 있기 때문에 유효하지 않습니다. 다음 발췌문을 고려해보세요고급 Bash 스크립팅 가이드:
폐막식제한 문자열, 여기서 문서의 마지막 줄은 다음으로 시작해야 합니다.첫 번째캐릭터 위치. 당신은 할 수 있습니다선행 공백 없음. 문자열 뒤의 공백을 제한하면 예기치 않은 동작이 발생할 수도 있습니다. 공백으로 인해 제한된 문자열이 인식되지 않습니다.
여기서 예외는 <<-
스타일 heredocs입니다. 이 스타일은 탭 들여쓰기를 무시하고 닫기 구분 기호에 대해 탭 들여쓰기도 허용합니다. 이에 대해서는 다음 단락에서 발췌하여 설명합니다.울위치 카니발 위키:
<<-END
대신 Heredoc 연산자로 사용하면<<END
Bash는 명령으로 보내기 전에 Heredoc 내용의 각 줄 시작 부분에 있는 모든 탭을 제거합니다. 이렇게 하면 여전히 탭(공백 아님)을 사용하여 Heredoc 콘텐츠와 나머지 코드를 들여쓸 수 있습니다. 이 탭은 Heredoc을 수신하는 명령으로 전송되지 않습니다. 탭을 사용하여 센티널 문자열을 들여쓸 수도 있습니다.