[bash] Bash에서 heredoc 값을 변수에 할당하는 방법은 무엇입니까?

이 여러 줄 문자열 (따옴표 포함)이 있습니다.

abc'asdf"
$(dont-execute-this)
foo"bar"''

Bash의 heredoc을 사용하여 변수에 어떻게 할당합니까?

줄 바꿈을 유지해야합니다.

문자열의 문자를 피하고 싶지 않아서 성 가실 것입니다 …



답변

쓸모없는 cat따옴표 사용을 피하고 일치하지 않는 따옴표를 더 잘 처리 할 수 있습니다 .

$ read -r -d '' VAR <<'EOF'
abc'asdf"
$(dont-execute-this)
foo"bar"''
EOF

반향 할 때 변수를 인용하지 않으면 줄 바꿈이 사라집니다. 인용하면 보존됩니다.

$ echo "$VAR"
abc'asdf"
$(dont-execute-this)
foo"bar"''

소스 코드에서 가독성을 위해 들여 쓰기를 사용하려면보다 작음 뒤에 대시를 사용하십시오. 들여 쓰기는 공백없이 탭만 사용하여 수행해야합니다.

$ read -r -d '' VAR <<-'EOF'
    abc'asdf"
    $(dont-execute-this)
    foo"bar"''
    EOF
$ echo "$VAR"
abc'asdf"
$(dont-execute-this)
foo"bar"''

대신 결과 변수의 내용에서 탭을 유지하려면에서에서 탭을 제거해야합니다 IFS. here doc ( EOF) 의 터미널 마커는 들여 쓰기해서는 안됩니다.

$ IFS='' read -r -d '' VAR <<'EOF'
    abc'asdf"
    $(dont-execute-this)
    foo"bar"''
EOF
$ echo "$VAR"
    abc'asdf"
    $(dont-execute-this)
    foo"bar"''

Ctrl– 를 눌러 명령 줄에 탭을 삽입 할 수 있습니다 V Tab. 편집기를 사용하는 경우 편집기에 따라 작동하거나 탭을 공백으로 자동 변환하는 기능을 해제해야 할 수도 있습니다.


답변

$ ()를 사용 cat하여 다음과 같이 변수 의 출력을 지정하십시오 .

VAR=$(cat <<'END_HEREDOC'
abc'asdf"
$(dont-execute-this)
foo"bar"''
END_HEREDOC
)

# this will echo variable with new lines intact
echo "$VAR"
# this will echo variable without new lines (changed to space character)
echo $VAR

작은 따옴표로 END_HEREDOC 시작을 구분해야합니다.

enddoc 구분 기호 END_HEREDOC는 줄에 단독으로 있어야하므로 끝 괄호는 다음 줄에 있습니다.

@ephemient답변 주셔서 감사합니다 .


답변

이것은 Dennis 방법의 변형이며 스크립트에서 더 우아해 보입니다.

기능 정의 :

define(){ IFS='\n' read -r -d '' ${1} || true; }

용법:

define VAR <<'EOF'
abc'asdf"
$(dont-execute-this)
foo"bar"''
EOF

echo "$VAR"

즐겨

ps는 지원하지 않는 쉘을 위해 ‘읽기 루프’ 버전을 만들었습니다 read -d. 백틱 과 함께 작동 set -eu하고 짝이 맞지 않지만 잘 테스트되지는 않습니다.

define(){ o=; while IFS="\n" read -r a; do o="$o$a"'
'; done; eval "$1=\$o"; }


답변

VAR=<<END
abc
END

stdin을 신경 쓰지 않는 것, 즉 할당으로 리디렉션하기 때문에 작동하지 않습니다.

export A=`cat <<END
sdfsdf
sdfsdf
sdfsfds
END
` ; echo $A

작동하지만이를 사용하지 못하게 할 수있는 백틱이 있습니다. 또한 백틱을 사용하지 않아야하므로 명령 대체 표기법을 사용하는 것이 좋습니다 $(..).

export A=$(cat <<END
sdfsdf
sdfsdf
sdfsfds
END
) ; echo $A


답변

줄 바꿈을 유지하는 솔루션은 여전히 ​​없습니다.

이것은 사실이 아닙니다-아마도 echo의 동작에 의해 잘못 인도되었을 것입니다.

echo $VAR # strips newlines

echo "$VAR" # preserves newlines


답변

Neil의 대답 에서 벗어나 면 종종 var가 필요하지 않으며 변수와 거의 같은 방식으로 함수를 사용할 수 있으며 인라인 또는 read기반 솔루션 보다 훨씬 쉽게 읽을 수 있습니다.

$ complex_message() {
  cat <<'EOF'
abc'asdf"
$(dont-execute-this)
foo"bar"''
EOF
}

$ echo "This is a $(complex_message)"
This is a abc'asdf"
$(dont-execute-this)
foo"bar"''


답변

배열은 변수이므로이 경우 mapfile이 작동합니다

mapfile y <<z
abc'asdf"
$(dont-execute-this)
foo"bar"''
z

다음과 같이 인쇄 할 수 있습니다

printf %s "${y[@]}"