이 여러 줄 문자열 (따옴표 포함)이 있습니다.
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[@]}"