루프에서 Here Document 변수를 사용하는 데 문제가 있습니다. 왜냐면 이게 효과가 있거든
while IFS= read -r line; do
echo "(${line})"
done <<EOF
one
two
three
EOF
그러나 이것은 그렇지 않습니다
foo=<<EOF
one
two
three
EOF
while IFS= read -r line; do
echo "(${line})"
done <<<"$foo"
이제 저는 bash 스크립팅이 처음입니다. 머리 위에 물음표가 있는 것 외에도 두 번째 구문(여기 스크립트 상단에 설명되어 있음)을 유지하고 어떻게든 작동하게 만드는 방법을 알고 싶습니다.
당신의 도움을 주셔서 감사합니다.
답변1
foo
이렇게 하면 변수가 구분된 문서의 내용으로 설정되지 않습니다 .
foo=<<EOF
one
two
three
EOF
리디렉션을 사용하여 빈 문자열에 대한 변수 할당입니다. 이렇게 하면 무슨 일이 일어나고 있는지 더 명확해질 수 있습니다.
foo="" <<EOF
one
two
three
EOF
하지만 실제로는 heredoc이 필요하지 않습니다. 그냥 해:
foo="one
two
three"
답변2
분명히 인라인 문서 변수를 원하고 이를 줄로 분할합니다. 다음을 수행할 수 있습니다.
lines=$(cat <<EOF
one two
three
four
EOF
)
IFS=$'\n' # split on non-empty lines
set -o noglob # disable globbing as we only want the split part.
# use split+glob (leave ${lines} unquoted):
for line in ${lines}; do
echo "${line}"
done
온라인으로 분할되지 않도록 IFS를 어떻게 설정했는지 확인하세요. spc/tab/newline으로 구분된 단어는 기본적으로 분할됩니다.