일치하는 '"'를 찾는 동안 예기치 않은 EOF가 발생했습니다. - bash 스크립트

일치하는 '"'를 찾는 동안 예기치 않은 EOF가 발생했습니다. - bash 스크립트

방금 bash 스크립트를 작성했는데 이 EOF 오류가 계속 발생합니다.

내 스크립트는 다음과 같습니다(OS X에만 해당).

#!/bin/bash

#DEFINITIONS BEGIN
en_sq() {
    echo -e "Enabling smart quotes..."
    defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool true
    status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
            if [ "$status" = "1" ]
                then
                    echo -e "Success! Smart quotes are now enabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
di_sq() {
    echo -e "Disabling smart quotes..."
    defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
    status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
            if [ "$status" = "0" ]
                then
                    echo -e "Success! Smart quotes are now disabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
en_sd() {
    echo -e "Enabling smart dashes..."
    defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool true
    status=$(defaults read NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool)
            if [ "$status" = "1" ]
                then
                    echo -e "Success! Smart dashes are now enabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
di_sd() {
    echo -e "Enabling smart dashes..."
    defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false
    status=$(defaults read NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool)
            if [ "$status" = "0" ]
                then
                    echo -e "Success! Smart dashes are now disabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
#DEFINITIONS END
#---------------

#BEGIN OF CODE with properties
#This is only terminated if the user entered properties (eg ./sqd.sh 1 1)
if [ "$1" = "1" ]
    then
        en_sq
    elif [ "$1" = "0" ]
        then
            di_sq
fi

if [ "$2" = "1" ]
    then
        en_sd
        #exit 0 if both, $1 and $2 are correct entered and processed.
        exit 0
    elif [ "$1" = "0" ]
        then
            di_sd
            #exit 0 if both, $1 and $2 are correct entered and processed.
            exit 0
fi
#END OF CODE with properties
#---------------------------


#BEGIN OF CODE without properties
#This is terminated if the user didn't enter two properties
echo -e "\n\n\n\n\nINFO: You can use this command as following: $0 x y, while x and y can be either 0 for false or 1 for true."
echo -e "x is for the smart quotes, y for the smart dashes."
sleep 1
echo -e " \n Reading preferences...\n"
status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
if [ "$status" = "1" ]
    then
        echo -e "Smart quotes are enabled."
    elif [ "$status" = "0" ]
    then
        echo -e "Smart quotes are disabled."

    else
        echo -e "Sorry, an error occured. You have to run this on OS X""
fi

status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
if [ "$status" = "1" ]
    then
        echo -e "Smart dashes are enabled."
    elif [ "$status" = "0" ]
    then
        echo -e "Smart dashes are disabled."

    else
        echo -e "Sorry, an error occured. You have to run this on OS X!"
fi

sleep 3
echo -e "\n\n You can now enable or disable smart quotes."

until [ "$SUCCESS" = "TRUE" ]
do
echo -e "Enter e for enable or d for disable:"
read sq

if [ "$sq" = "e" ]
    then
        en_sq
    elif [ "$sq" = "d" ]
        then
            di_sq
    else
        echo -e "\n\n ERROR! Please enter e for enable or d for disable!"
fi
done
SUCCESS="FALSE"

echo -e "\n\n You can now enable or disable smart dashes."

until [ "$SUCCESS" = "TRUE" ]
do
echo -e "Enter e for enable or d for disable:"
read sq

if [ "$sd" = "e" ]
    then
        en_sd
    elif [ "$sd" = "d" ]
        then
            di_sd
    else
        echo -e "\n\n ERROR! Please enter e for enable or d for disable!"
fi
done

이건 내 잘못이야:

./coding.sh: line 144: unexpected EOF while looking for matching `"'
./coding.sh: line 147: syntax error: unexpected end of file

답변1

질문을 보면 문제가 보입니다. 95행 이후 구문 강조 표시가 어떻게 엉망이 되는지 확인하세요.

echo -e "Sorry, an error occurred. You have to run this on OS X""

오류 메시지에서 알 수 있듯이 불일치가 있습니다 ". "위 줄에서 초과분을 제거하세요.

echo -e "Sorry, an error occurred. You have to run this on OS X"

답변2

실제 상황에서는 이 오류를 추적하기 어려울 수 있습니다. 여기서 저는 실제 상황에 대한 해결책을 제시합니다. 내 스크립트를 예로 사용하겠습니다.

쉘 스크립트를 업데이트했습니다. 실행할 때 다음과 같은 오류 메시지가 나타납니다.

/somepath/bin/myshellscript: line 1508: unexpected EOF while looking for matching `"'
/somepath/bin/myshellscript: line 1520: syntax error: unexpected end of file

line 1508 elif [ "$project" ]; then

이것은 큰따옴표 쌍이 있는 마지막 줄입니다.

일반적으로 나는 쉘 스크립트를 수정할 때마다 이것을 확인합니다. 이번에는 하루를 기다렸다가 어디서 수정해야 할지 잊어버렸습니다. 이 줄(1508) 앞 부분에서 문제가 발생합니다. 문제는 나도 개요 1508에 댓글을 달았다는 것이다.

#elif [ "$project" ]; then

셸 실행 프로그램은 여전히 ​​1508행에 문제가 있다고 말합니다.

다음으로 원본 쉘 스크립트를 복사했습니다. 하단에서 많은 코드를 제거하십시오. 그런 다음 다음 명령을 사용하여 내 코드를 확인하십시오.

bash -n mysbashscript

mybashscript: line 515: unexpected EOF while looking for matching `"'
mybashscript: line 561: syntax error: unexpected end of file

이제 내 파일 크기는 원본 크기의 1/3입니다. 나는 즉시 문제를 발견했습니다.

497 prepare_alignment() {
498     local projdir=${1:?"did not give project directory"}
499     local samp=${2:?"did not give sample name"}
500     local merged=${3:?"must give merged bam file name} # here is the problem

어떤 이유로 쉘 파서가 "내부 불일치를 포착하지 못합니다. {}여기서 쉘 파서가 더욱 향상될 수 있습니다.

문제를 찾는 가장 빠른 알고리즘은 아래쪽에서 코드의 절반을 제거하는 것입니다. 구문 오류가 사라지면 이 절반에 있는 것입니다. 구문 오류가 지속되면 전반부에 문제가 있는 것입니다.

후반부에 문제가 있으면 삭제를 취소하세요. 이 과정을 반복하세요. 범위를 좁혀 문제의 원인을 찾을 수 있습니다.

코드를 삭제하는 경우 코드 전체를 삭제해야 합니다. 전체 기능과 같은.

bash를 사용 -n script_name하거나 스크립트를 직접 실행할 수 있습니다. 둘 다 작동해야합니다. (여기서 script_name은 설명을 위한 fooscript 또는 barscript일 뿐이며 실제 스크립트 이름은 한 단어여야 합니다.)

답변3

중괄호가 없어서 이런 오류가 발생했습니다...

docker tag "${FOO" "${BOO}"

답변4

고려해야 할 또 다른 사항은 일부 주요 문자가 블록을 시작하고 큰따옴표가 문제가 되지 않을 수 있다는 것입니다. 모든 변수를 bash에서 중괄호로 묶었지만, 실수로 중괄호 대신 대괄호를 사용하면 이 오류가 표시되고 따옴표가 모두 실망스럽게 정렬됩니다. Kemin Zhou의 프로세스를 사용하여 이 오타를 찾을 수 있었습니다. echo "Starting $[report_name}" >> ${log}처럼 보입니다 echo "Starting ${report_name}" >> ${log}. 큰따옴표는 문제가 되지 않지만 보도에 따르면 그런 경우입니다.

관련 정보