내 파일에 다음 코드 블록이 있습니다.
175 MY_IP=`ifconfig eno1 | grep netmask | tr -s ' ' | cut -d " " -f 3`
176 echo "" > /home/hadoop/.ssh/config
177 cat > /home/hadoop/.ssh/config <<EOF
178 Host `echo $MY_IP | sed 's/.[0-9][0-9]*$//g'`.* 0.0.0.0 master worker*
179 StrictHostKeyChecking no
180 UserKnownHostsFile=/dev/null
181 EOF
파일에 178~181행을 쓰고 싶지만 다음과 같은 오류 출력이 나타납니다.
/script.sh: line 178: unexpected EOF while looking for matching `''
/script.sh: line 184: syntax error: unexpected end of file
구문을 확인하지 않고 해당 텍스트를 복사하지 않는 이유는 무엇입니까?
업데이트: 현재 내 코드와 오류 메시지는 다음과 같습니다.
175 MY_IP=`ifconfig eno1 | grep netmask | tr -s ' ' | cut -d " " -f 3`
176 echo "" > /home/hadoop/.ssh/config
177 cat > /home/hadoop/.ssh/config <<EOF
178 Host `echo $MY_IP | sed "s/.[0-9][0-9]*$//g"`.* 0.0.0.0 master worker*
179 StrictHostKeyChecking no
180 UserKnownHostsFile=/dev/null
181 EOF
182
183 chown -R hadoop:hadoop /home/hadoop
/script.sh: 175행: 일치하는 ""를 찾는 동안 예기치 않은 EOF가 발생했습니다.
/script.sh: 184행: 구문 오류: 예기치 않은 파일 끝
해결됨: 코드를 확인한 후 첫 번째 줄에 작은따옴표가 누락된 것을 발견했습니다. 다른 것과 페어링하면 문제가 해결됩니다.
답변1
쉘은 `echo ...`
여기 문서에서 다양한 유형의 확장을 수행합니다(사용자와 같은 명령 대체뿐만 아니라 변수 및 산술 확장도 포함).구분 기호를 인용하지 않는 한.
비교하다:
cat <<EOF
$$ $((2 + 3)) $(hostname) `date`
EOF
4502 5 fazq Mon Mar 11 23:03:27 EET 2019
비교:
cat <<'EOF'
$$ $((2 + 3)) $(hostname) `date`
EOF
$$ $((2 + 3)) $(hostname) `date`
마지막 경우에는 큰따옴표나 작은따옴표 모두 괜찮습니다.
답변2
에서 man bash
:
여기에 파일
이러한 유형의 리디렉션은 셸이 다음이 될 때까지 현재 소스에서 입력을 읽도록 지시합니다.구분 기호만 포함하는 줄(후행 공백 없음)본 적이 있습니다. 이 지점까지 읽은 모든 행은 명령의 표준 입력(또는 n이 지정된 경우 파일 설명자 n)으로 사용됩니다.
현재 질문에 게시된 대로 EOF 줄에는 후행 공백이 포함되어 있습니다. 삭제하세요.
답변3
여기에는 전체 스크립트가 없지만 여기 문서의 따옴표를 작은 따옴표에서 큰 따옴표로 변경할 때 "일치 [작은 따옴표]를 찾는 동안 예기치 않은 EOF"의 줄 번호가 178에서 어떻게 변경되는지 확인하세요. .
이는 실제 문제(미완성 참조)가 귀하가 게시한 스니펫 이전 어딘가에 있다는 것을 의미합니다.
예를 들어, 다음 스크립트에서실제오류는 분명히 첫 번째 줄에 있지만 쉘의 관점에서 보면 거기에서 시작하는 인용된 문자열은 다음 인용문까지 계속되고 짝이 없는 문자열은 다음 문자열이 됩니다 bar
(구문 강조 표시를 참고하세요). 두 번째 것은 echo
인용되었지만 foo
그렇지 bar
않습니다):
$ cat quote.sh
echo 'error here
echo 'foo' 'bar'
$ bash quote.sh
quote.sh: line 3: unexpected EOF while looking for matching `''
quote.sh: line 4: syntax error: unexpected end of file
두 번째 echo
명령을 변경하여 echo "foo" "bar"
라인 1에 오류를 표시합니다. 이는 작은따옴표로 묶인 마지막 문자열이 시작되는 라인이 되기 때문입니다.
전체 스크립트를 더 자세히 살펴봐야 합니다. 또는 shellcheck.net에 덤프하면 다음과 같은 내용이 표시됩니다.