`" 'ile eşleşmeye bakarken beklenmeyen EOF - bash betiği


37

Ben sadece bir bash betiği yazdım ve her zaman bu EOF-Error'u alıyorum.

İşte benim senaryom (sadece OS X üzerinde çalışıyor):

#!/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

Ve işte benim hatam:

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

Yanıtlar:


31

Sorunuza sadece bakarsanız sorununuzu görebilirsiniz. 95. satırdan sonra sözdizimi vurgulamanın nasıl berbat edildiğine dikkat edin:

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

Hata mesajının size söylediği gibi, eşsiz bir eşiniz var ". Sadece "yukarıdaki satırdan ekstraları kaldırın ve iyi olmanız gerekir:

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

1
Garip, ben de aynı sorunu vardı ve ben bir komik çünkü sudo echo ""bırakarak 2 çift tırnak Çıkarma .. çizgi sudo echomükemmel çalışır yapar.
vinzee

@vinzee neden hiç aday olacağını echobirlikte sudo? Bu, tarif ettiğin şeyin pek bir anlam ifade etmediğini, devam eden başka bir şeyin olması gerektiğini söyledi.
terdon

Yapmam sudo echokomut gerekir çünkü sudosonradan komutları ama kullanıcı erkenden şifresini girmek isteyen birkaç dakika böylece komut onun girişi ihtiyacı olmadığını artık. Ve hata için, burada görüldüğü gibi aynı hatayı yaşadım, ancak 2 çift tırnak işareti kaldırılarak çözüldü. Başka bir şey olmadı ..
vinzee

1
@vinzee okumak isteyebilirsiniz Bir 'sudo' komutunu bir komut dosyasında nasıl çalıştırabilirim? . Alıntılara gelince, başka bir şey olmalı. Belki de onlarla silinen alıntılardan sonra basılmayan bir karakteriniz vardı. Ya da belki iki tek alıntı yaptınız ve sonra bir double ( echo ''") ya da onun gibi bir şey yaptınız , ama iyi olduğundan beri bir şeyler olmalıydı echo "".
terdon

Bağlantı için teşekkürler, haklısın. Koşmak sudo echobiraz garip hissettirdi .. Ve bu gece linux kurulumumda tekrar deneyeceğim ve sonuçları yorumlamaya geri döneceğim.
vinzee

3

Bu hatayı gerçek durumlarda izlemek zor olabilir. Burada gerçek dünya durumu için bir çözüm sunuyorum. Senaryomu örnek olarak kullanacağım.

Shell betiğimi güncelledim. Yürütürken aşağıdaki hata mesajını aldım:

/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

Bu, bir çift çift tırnak içeren son satırdır.

Normalde, her değiştirdiğimde kabuk betiğimi kontrol ederim. Bu sefer bir gün bekledim ve nerede değişiklik yaptığımı unuttum. Sorun bu çizgiden önce herhangi bir yerde meydana geldi (1508). Sorun şu ki 1508 hattını bile yorumladım

#elif [ "$project" ]; then

Kabuk uygulayıcı hala 1508 hattının sorun yaşadığını söyledi.

Sonra orijinal kabuk betiğinin bir kopyasını yaptım. Bir sürü kodun alttan silinmesi. Sonra kodumu aşağıdaki komutla doğrula

bash -n mysbashscript

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

Şimdi benim dosya orijinal boyutunun 1 / 3'ü. Hemen sorunu gördüm:

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

Bazı Nedenler için, eşlenmemiş "inside {} kabuk ayrıştırıcısı tarafından yakalanmaz. Bu, kabuk ayrıştırıcısının daha da geliştirilebileceği yerdir.

Sorunu bulmak için en hızlı algoritma, kodunuzun yarısını alttan silmek, sözdizimi hatası ortadan kalkarsa, o zaman bu yarıda olur. Sözdizimi hatası hala oradaysa, sorun üst yarıdadır.

Daha sonraki yarıda sorun varsa, silme işlemini geri alın. Bu işlemi tekrarlayın. Sorunun kaynağını bulmak için daha küçük bir boyuta daraltabilirsiniz.

Kod silerken, kodun tamamını silmek zorundasınız. Örneğin tüm işlev.

Bash -n scriptname 'sini kullanabilir veya sadece scetiği doğrudan çalıştırabilirsiniz. Her ikisi de çalışmalı.


1
"Bazı Sebepler için, eşleşmeyen" {} içindeki kabuk ayrıştırıcı tarafından yakalanmıyor. "Bu, sözdizimsel olarak eşleştiğinden, satır 1508'de mi? dize 1508'de açılacak asla kapanmaz
philh

Bash'ın alıntılama davranışını araştırmadım. Bash'in çok satırlı bir teklifi olabilir "line1 \ nline2" Shell'de << ENDMARK ile çok satırlı bir teklif yaptığınızı hatırlıyorum. Muhtemelen şimdi birden fazla satırı alıntılamak için doğrudan çift alıntı kullanabilirsiniz. Bu özellik hata ayıklamayı gerçekten zorlaştırıyor.
Kemin Zhou
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.