EOF ที่ไม่คาดคิดขณะค้นหาการจับคู่ `" '- สคริปต์ทุบตี


37

ฉันเพิ่งเขียนสคริปต์ bash และรับ EOF-Error นี้เสมอ

ดังนั้นนี่คือสคริปต์ของฉัน (ใช้ได้กับ 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

คำตอบ:


31

คุณสามารถเห็นปัญหาของคุณหากคุณเพียงแค่ดูที่คำถามของคุณ สังเกตว่าการไฮไลต์ไวยากรณ์ถูกทำให้เมาหลังจากบรรทัด 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"

1
แปลกฉันมีปัญหาเดียวกันและเป็นเพราะฉันมีsudo echo ""สาย .. การลบเครื่องหมายคำพูดคู่ 2 ใบออกsudo echoทำให้การทำงานสมบูรณ์
vinzee

@vinzee ทำไมคุณถึงเคยวิ่งechoด้วยsudo? ที่กล่าวว่าสิ่งที่คุณอธิบายไม่สมเหตุสมผลนักต้องมีบางอย่างเกิดขึ้น
terdon

ฉันทำsudo echoเพราะสคริปต์จะต้องใช้sudoในภายหลังในคำสั่ง แต่ฉันต้องการให้ผู้ใช้ป้อนรหัสผ่านของเขา แต่เนิ่นๆเพื่อให้สคริปต์ไม่ต้องการอินพุตของเขาอีกต่อไปในเวลาไม่กี่นาที และสำหรับข้อผิดพลาดฉันมีข้อผิดพลาดแบบเดียวกับที่เห็นที่นี่ แต่ก็แก้ไขได้ด้วยการลบเครื่องหมายคำพูดคู่ 2 ตัว ไม่มีอะไรเกิดขึ้น ..
vinzee

1
@vinzee คุณอาจต้องการอ่านฉันจะเรียกใช้คำสั่ง 'sudo' ภายในสคริปต์ได้อย่างไร . สำหรับราคาก็ต้องมีอย่างอื่น บางทีคุณอาจมีตัวละครที่ไม่พิมพ์หลังจากคำพูดที่ถูกลบไปกับพวกเขาเช่น หรือบางทีคุณอาจมีสองราคาเดียวแล้วคู่ ( echo ''") หรือสิ่งที่ต้องการ แต่จะต้องมีบางสิ่งบางอย่างตั้งแต่echo ""เป็นเรื่องปกติ
terdon

ขอบคุณสำหรับลิงค์คุณพูดถูก การรันsudo echoรู้สึกแปลก ๆ .. และฉันจะลองอีกครั้งในการติดตั้ง linux ของฉันคืนนี้และกลับไปแสดงความคิดเห็นที่นี่ผลลัพธ์
vinzee

3

ข้อผิดพลาดนี้อาจติดตามได้ยากในสถานการณ์จริง ที่นี่ฉันให้ทางออกหนึ่งสำหรับสถานการณ์โลกแห่งความจริง ฉันจะใช้สคริปต์ของฉันเป็นตัวอย่าง

ฉันอัพเดตเชลล์สคริปต์ เมื่อดำเนินการฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:

/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

ด้วยเหตุผลบางอย่างตัวแยกวิเคราะห์เชลล์ที่ไม่ตรงกัน "shell {}" นี่คือที่ที่ตัวแยกวิเคราะห์เชลล์สามารถปรับปรุงได้

อัลกอริทึมที่เร็วที่สุดในการค้นหาปัญหาคือการลบรหัสครึ่งหนึ่งออกจากด้านล่างหากข้อผิดพลาดทางไวยากรณ์หายไปแสดงว่าอยู่ในครึ่งนี้ หากข้อผิดพลาดทางไวยากรณ์ยังคงมีปัญหาในครึ่งบน

หากมีปัญหาในช่วงครึ่งหลังให้เลิกทำการลบ ทำซ้ำกระบวนการนี้ คุณสามารถ จำกัด ขนาดให้เล็กลงเพื่อค้นหาที่มาของปัญหา

เมื่อลบรหัสคุณต้องลบทั้งส่วนของรหัส ตัวอย่างเช่นฟังก์ชั่นทั้งหมด

คุณสามารถใช้ bash -n scriptname หรือเพียงแค่รันสคริปต์โดยตรง ทั้งสองควรทำงาน


1
"ด้วยเหตุผลบางอย่างการจับคู่ที่ไม่ตรงกัน" ภายใน {} จะไม่ถูกจับโดย shell parser "นั่นเป็นเพราะ syntactically มันถูกจับคู่ใน 1508 บรรทัดหรือไม่นั่นคือสตริงที่เปิดในบรรทัดที่ 500 ถูกปิดที่บรรทัด 1508 แล้วก็อีก สตริงเปิดใน 1508 ซึ่งไม่เคยได้รับปิด.
philh

ฉันไม่ได้ตรวจสอบพฤติกรรมการอ้างอิงของทุบตี Bash อาจมีเครื่องหมายคำพูดหลายบรรทัด "line1 \ nline2" ฉันจำได้ในเปลือกคุณทำเครื่องหมายหลายบรรทัดด้วย << ENDMARK เป็นไปได้ตอนนี้คุณสามารถใช้เครื่องหมายคำพูดคู่โดยตรงเพื่ออ้างอิงหลายบรรทัดได้ คุณสมบัตินี้ทำให้การดีบักยากมาก
Kemin Zhou
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.