อะไร; ทำใน SH


28

ถ้าฉันพยายามที่จะทำงานa;;bใน sh ฉันได้รับข้อผิดพลาดนี้:

sh: <number>: Syntax error: ";;" unexpected

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

นี่คือตัวอย่าง:

$ echo A;;echo B
sh: 1: Syntax error: ";;" unexpected
$ echo A;;;echo B
sh: 1: Syntax error: ";;" unexpected
$ echo A; ;echo B
sh: 1: Syntax error: ";" unexpected

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


1
ไม่สามารถค้นหาใน Google เนื่องจาก;;และไม่พบผู้ที่ตกเป็นเหยื่อที่นี่
EKons

3
Googled "sh double semicolon" ... stackoverflow.com/questions/16905183/…
muru

@muru ถึงแม้ว่าจะไม่ได้โพสต์ที่นี่ แต่ฉันคิดว่า
EKons

@ ΈρικΚωνσταντόπουλοςนั่นคือสิ่งที่ SymbolHound ใช้สำหรับ symbolhound.com
Joe

คำตอบ:


47

;;แยกข้อความสั่งในcase... esacสร้างในเชลล์ POSIX:

case foo in (a) cmd1; cmd2 ;; (b) cmd3; cmd4; esac

man that-commandเพื่อหาข้อมูลเกี่ยวกับคำสั่งคุณสามารถเรียกใช้ ถ้าเพจเจอร์ของคุณคุณสามารถค้นหาภายในหน้าคนโดยการกดless/

ที่นี่คุณต้องการใช้และค้นหาman sh ;;เชลล์บางตัวสนับสนุนโอเปอเรเตอร์อื่นเพื่อแยกcaseข้อความสั่ง (เช่น;&ในksh93/ zsh/ bash/ mksh, &|in zsh/ mksh, ;;&in bash)


1
ฉันเพิ่งโพสต์ที่นี่เพราะฉันคิดว่าควรมีคำถามเช่นนี้ที่นี่อย่างไรก็ตามเนื่องจากที่นี่สามารถอธิบายได้อย่างชัดเจนถ้ามีคนสับสน
EKons

2
หากมีการเข้าชมจำนวนมากหรือคุณจำกฎการหลบหนีสำหรับการค้นหาlessไม่ได้บางครั้งก็เป็นประโยชน์ในการ$ man bash|grep -C1 ';;'
2560

คุณไม่ควรมี(มาก่อนa)และb)คุณต้องการ;;หลังจากนั้นcmd4
Barmar

@Barmar ไวยากรณ์นั้นคือ POSIX ในเชลล์เป้าหมายคุณต้องละเว้นสิ่ง(นี้ แต่คุณยังไม่ต้องการสิ่งนั้น;;มาก่อนesac(แม้ว่าจะไม่เป็นอันตราย)
Stéphane Chazelas

ขอบคุณ ฉันไม่รู้เกี่ยวกับการเปลี่ยนแปลงใน POSIX เชลล์หรืออันสุดท้าย;;เป็นทางเลือก
Barmar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.