EOF yang tak terduga saat mencari pencocokan `" '- skrip bash


38

Saya baru saja menulis skrip bash dan selalu mendapatkan EOF-Error ini.

Jadi inilah skrip saya (hanya berfungsi pada 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

Dan ini kesalahan saya:

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

Jawaban:


32

Anda dapat melihat masalah Anda jika hanya melihat pertanyaan Anda. Perhatikan bagaimana penyorotan sintaksis kacau setelah baris 95:

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

Seperti pesan kesalahan memberitahu Anda, Anda memiliki yang tidak cocok ". Hapus saja ekstra "dari baris di atas dan Anda akan baik-baik saja:

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

1
Anehnya, saya memiliki masalah yang sama dan itu karena saya memiliki sudo echo ""garis .. Menghapus 2 tanda kutip ganda, meninggalkan sudo echomembuatnya bekerja dengan sempurna.
vinzee

@vinzee mengapa anda pernah menjalankan echodengan sudo? Yang mengatakan, apa yang Anda gambarkan tidak masuk akal, pasti ada sesuatu yang terjadi.
terdon

Saya melakukannya sudo echokarena skrip akan memerlukan sudoperintah nanti, tetapi saya ingin pengguna memasukkan kata sandinya lebih awal, sehingga skrip tidak memerlukan inputnya lagi selama beberapa menit. Dan untuk bug, saya memiliki kesalahan yang sama seperti yang terlihat di sini, tetapi itu diselesaikan dengan menghapus 2 tanda kutip ganda. Tidak ada yang terjadi ..
vinzee

1
@vinzee Anda mungkin ingin membaca Bagaimana cara menjalankan perintah 'sudo' di dalam skrip? . Adapun kutipan, pasti ada sesuatu yang lain. Mungkin Anda memiliki karakter non-cetak setelah kutipan yang dihapus bersama mereka, misalnya. Atau mungkin Anda memiliki dua tanda kutip tunggal dan kemudian tanda kutip ganda ( echo ''") atau sesuatu seperti itu, tetapi harus ada sesuatu karena echo ""itu baik-baik saja.
terdon

Terima kasih atas tautannya, Anda benar. Menjalankan sudo echoterasa agak aneh .. Dan saya akan mencoba lagi di linux install malam ini dan kembali mengomentari hasilnya.
vinzee

4

Kesalahan ini bisa sulit dilacak dalam situasi nyata. Di sini saya memberikan satu solusi untuk situasi dunia nyata. Saya akan menggunakan skrip saya sebagai contoh.

Saya memperbarui skrip shell saya. Saat menjalankannya saya mendapat pesan kesalahan berikut:

/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

Ini adalah baris terakhir yang memiliki sepasang tanda kutip ganda.

Biasanya, saya memeriksa skrip shell saya setiap kali saya memodifikasinya. Kali ini, saya menunggu satu hari dan lupa di mana saya membuat modifikasi. Masalahnya terjadi di mana saja sebelum baris ini (1508). Masalahnya adalah bahwa saya bahkan berkomentar baris 1508

#elif [ "$project" ]; then

algojo shell masih mengatakan baris 1508 memiliki masalah.

Selanjutnya saya membuat salinan skrip shell asli. Menghapus sejumlah besar kode dari bawah. Kemudian validasi kode saya dengan perintah berikut

bash -n mysbashscript

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

Sekarang file saya 1/3 dari ukuran aslinya. Saya segera melihat masalahnya:

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

Untuk beberapa alasan, "dalam {} yang tidak cocok tidak ditangkap oleh pengurai shell. Di sinilah pengurai shell dapat ditingkatkan lebih lanjut.

Algoritma tercepat untuk menemukan masalah, adalah menghapus setengah dari kode Anda dari bawah, jika kesalahan sintaks hilang, maka itu ada di setengah ini. Jika kesalahan sintaks masih ada, masalah di bagian atas.

Jika ada masalah di paruh berikutnya, batalkan hapus. Ulangi proses ini. Anda dapat mempersempit ke ukuran yang lebih kecil untuk menemukan sumber masalahnya.

Saat menghapus kode, Anda harus menghapus seluruh bagian kode. Misalnya seluruh fungsinya.

Anda dapat menggunakan bash -n scriptname atau langsung menjalankan skrip. Keduanya harus bekerja.


1
"Untuk beberapa Alasan, yang tak tertandingi" dalam {} tidak ditangkap oleh shell parser." Apakah itu hanya karena sintaksis, itu adalah cocok, on line 1508? Yaitu string dibuka on line 500 ditutup pada baris 1508, dan kemudian lain string dibuka pada 1508 yang tidak pernah akan ditutup.
philh

Saya tidak menyelidiki perilaku mengutip bash. Bash mungkin memiliki kutipan multi-line "line1 \ nline2" Saya ingat Anda menggunakan multi-line quote dengan << ENDMARK. Mungkin sekarang Anda dapat langsung menggunakan penawaran ganda untuk mengutip beberapa baris. Fitur ini membuat debug sangat sulit.
Kemin Zhou
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.