เครื่องหมายอัฒภาคไม่จำเป็นที่ท้ายบรรทัดในเชลล์สคริปต์?


105

ฉันมีเชลล์สคริปต์ซึ่งมีสิ่งต่อไปนี้:

case $1 in
    0 )
    echo $1 = 0;
    OUTPUT=3;;
    1 )
    echo $1 = 1;
    OUTPUT=4;;
    2 )
    echo $1 = 2;
    OUTPUT=4;;
esac

HID=$2;
BUNCH=16;
LR=.008;

คือ อัฒภาคสมบูรณ์ฟุ่มเฟือยในตัวอย่างข้างต้นหรือไม่ และมีเหตุผลใดที่บางคนใช้อัฒภาคสองชั้น?

ดูเหมือนว่าอัฒภาคเป็นเพียงตัวคั่นซึ่งเป็นสิ่งที่คุณจะใช้แทนบรรทัดใหม่

คำตอบ:


153

อัฒภาคเดี่ยวที่ท้ายบรรทัดนั้นไม่จำเป็นเนื่องจากขึ้นบรรทัดใหม่ยังเป็นตัวคั่นคำสั่ง caseต้องการโดยเฉพาะอัฒภาคสองครั้งที่ส่วนท้ายของคำสั่งสุดท้ายในแต่ละบล็อกรูปแบบ ดูhelp caseรายละเอียด


20
เยี่ยมมาก! ดังนั้นถ้าฉันเข้าใจคุณถูกต้องฉันสามารถลบอัฒภาคเดี่ยว ๆ ที่ท้ายบรรทัดใดก็ได้อย่างปลอดภัย แต่จะไม่ซ้ำสอง?
Nagel

29

ตามman bash:

  metacharacter
         A character that, when unquoted, separates words.  One of the following:
         |  & ; ( ) < > space tab
  control operator
         A token that performs a control function.  It is one of the following symbols:
         || & && ; ;; ( ) | |& <newline>

ดังนั้นตัวละคร;สามารถเป็นตัวแสดงหรือตัวดำเนินการควบคุมได้ในขณะที่;;ตัวดำเนินการควบคุมจะเป็นตัวดำเนินการเสมอ (ในกรณีคำสั่ง)

ในรหัสเฉพาะของคุณ;ไม่จำเป็นต้องมีทั้งหมดที่ท้ายบรรทัด ;;เป็นสิ่งจำเป็นอย่างไร


4
อะไรคือความแตกต่างในทางปฏิบัติระหว่าง;และ;;แล้ว? ฉันไม่คุ้นเคยกับการแยกวิเคราะห์ไวยากรณ์ BASH มากพอที่จะทราบความแตกต่างในทางปฏิบัติระหว่างสิ่งที่ BASH เรียกว่า "metacharacter" และสิ่งที่เรียกว่า
jvriesem

1
เห็นด้วยกับคำถามและความคิดเห็นของ jvriesem ตัวอย่างเอกสารดูแคบเกินไป
grgry


1

@ Opensourcebook-Amit

บรรทัดใหม่เทียบเท่ากับอัฒภาคเดียว ;บนเทอร์มินัลหรือในเชลล์สคริปต์

ดูตัวอย่างด้านล่าง:

บนเทอร์มินัล:

[root@server test]# ls;pwd;

บนเชลล์สคริปต์:

[root@server test]# cat test4.sh

echo "Current UserName:"
whoami

echo -e "\nCurrent Date:";date;

[root@server test]#

แต่ฉันไม่เห็นด้วยกับความคิดเห็นที่&เทียบเท่ากับขึ้นบรรทัดใหม่หรืออัฒภาคเดี่ยว

& รันคำสั่งในพื้นหลังเป็นตัวคั่นคำสั่ง แต่ไม่ทำงานเป็นอัฒภาคหรือขึ้นบรรทัดใหม่


-1

@Ignacio Vazquez-Abrams

อันที่จริงนี่ไม่ถูกต้องอย่างสมบูรณ์อัฒภาคเดี่ยวที่ท้ายบรรทัดไม่ฟุ่มเฟือยและไม่ใช่สิ่งเดียวกับบรรทัดใหม่

จากคู่มืออ้างอิง Bash

คำสั่งคั่นด้วยเครื่องหมาย ';' จะดำเนินการตามลำดับ; เชลล์จะรอให้แต่ละคำสั่งยุติตามลำดับ สถานะการส่งคืนคือสถานะออกของคำสั่งสุดท้ายที่ดำเนินการ

คำสั่งที่คั่นด้วย "บรรทัดใหม่" อาจดำเนินการควบคู่กันเมื่อคำสั่งที่คั่นด้วยอัฒภาคจะดำเนินการตามลำดับเสมอ


5
นี่เป็นเท็จ ไม่มีความแตกต่างกัน หากคุณอ่านส่วนเดียวกันของคู่มืออย่างถูกต้องคุณจะเห็นสิ่งนี้เพียงไม่กี่บรรทัดด้านบน: A sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.ดังนั้นสิ่งที่คุณยกมาเกี่ยวกับอัฒภาคจะนำไปใช้กับบรรทัดใหม่อย่างเท่าเทียมกัน
underscore_d

1
ฉันยอมรับว่าประโยคนี้คลุมเครือฉันคิดว่าสิ่งที่ผู้เขียนหมายถึงคือ ";" และ "\ n" สามารถใช้ได้มากกว่าหนึ่งครั้งเพื่อแยกคำสั่ง แต่ไม่ใช่ว่าพวกเขากำลังทำสิ่งเดียวกัน ฉันพบลิงค์นี้: unix.stackexchange.com/questions/53390/… ฉันยังไม่รู้เรื่องนี้มาก่อนจริงๆว่าฉันมีปัญหากับสคริปต์บางส่วนที่ฉันเขียนและถูกตั้งข้อสังเกตเกี่ยวกับความแตกต่างระหว่าง ";" และ "\ n" โดยเพื่อนร่วมงานคนหนึ่งของฉัน น่าเสียดายที่นี่นานมาแล้วและฉันจำไม่ได้ว่ามันคืออะไรโพสต์ตัวอย่างที่นี่
IJ

2
หากคุณอ่านโพสต์ที่คุณเชื่อมโยงกับ @IJ คุณจะเห็นว่าความเท่าเทียมกันนั้นมาจากสิ่งที่&ไม่ใช่ไฟล์\n. ในความคิดเห็นก็จะถูกระบุว่าเขาสามารถข้ามอัฒภาคเพราะเห็นได้ชัดว่า&ยังเป็นตัวคั่นคำสั่งเช่นเดียวกับและ; \n
Matthias
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.