เป็นไปได้ไหมที่จะแทนที่“ แล้ว” ด้วยวงเล็บ?


10

ฉันเรียนรู้วิธีการเขียนโค้ดเป็นCภาษาแรกและการใช้งาน

if ( code )
then 
code
fi

ทำให้มันยากสำหรับฉันที่จะอ่านโค้ดของฉัน (อย่าถามว่าทำไม) มีสิ่งทดแทนthenหรือไม่?

บางสิ่งเช่นนี้

if ( code ) {
 code
}
fi

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

คำตอบ:


21

ไม่มีสิ่งใดทดแทน แต่คุณสามารถใช้ทั้งคู่ได้หากคุณต้องการเครื่องมือจัดฟัน:

if true ; then {
    something
} fi

ที่ใช้กลุ่มคำสั่งที่ไม่จำเป็นซึ่งมีการค้ำยันอย่างชัดเจนเป็นเนื้อความของthenบล็อก คำสั่งใด ๆ ในการจัดฟันจะถูกดำเนินการในเปลือกปัจจุบันเมื่อการthenทำงานเหมือนกับว่าการจัดฟันไม่ได้มี

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


นี่คืออีกสิ่งหนึ่งซึ่ง "ไม่คุ้มค่าที่จะแนะนำ" - วงเล็บปีกกา: { if { [[ a == aa ]];};then { echo yes;};else { echo no;}; fi;}- โดยทั่วไปเมื่อคุณใช้bashเพียงพอ ไวยากรณ์มาตรฐานจะคุ้นเคยพอดังนั้นมันจึงไม่เป็นปัญหามากนัก
Peter.O

15

ดูเหมือนว่าคุณจะมองหาเปลือก C ( csh, tcshฯลฯ ... ) โปรดทราบว่าผู้เชี่ยวชาญแนะนำให้กับมันสำหรับการเขียนโปรแกรม

ฉันไม่แน่ใจว่าส่วนที่คุณคิดว่าน่าสนใจหรือไม่นั้นเป็นความจริงที่thenอยู่ในบรรทัดต่อไปนี้หรือไม่? หากเป็นเช่นนั้นให้พิจารณาใช้รูปแบบต่อไปนี้:

if condition; then
    stuff
fi

ฉันต้องยอมรับว่าชื่อคำสั่งการสะกดถอยหลังเช่นfiสำหรับifและesacสำหรับcase( แต่ไม่ใช่elihwสำหรับwhile!) เป็นชนิดของการเล่นโวหาร แต่นั่นเป็นบอร์นเชลล์มาตรฐานซึ่งเป็นไวยากรณ์เชลล์แบบพกพาที่สุดที่คุณสามารถใช้ได้


ขอบคุณสำหรับคำตอบของคุณ - ฉันไม่พบว่าthenไม่สวยก็เพียงว่าบรรณาธิการของฉันจะเน้นที่สอดคล้องกัน{}คู่และที่มีประโยชน์สำหรับเมื่อฉันมีการเรียงลำดับของความผิดพลาดบางอย่างแล้วเพราะผมสามารถมองเห็นทั้งหมดของฉันifงบและดูว่าสิ่งที่ผิดพลาด .
智障的人

1
อ่าใช่ บวกviของ%คำสั่งซึ่งกระโดดไปรั้งที่ตรงกัน / วงเล็บ / วงเล็บ ฉันเห็นอกเห็นใจ ฉันคิดถึงvi's %คำสั่งเมื่อการเขียนโปรแกรมในหลาม
Celada

8
คุณได้ลองปลั๊กอิน matchit vim แล้วหรือยัง? รองรับการข้าม% สำหรับ if / fi ใน bash และบล็อกอื่น ๆ มากมายในภาษาอื่น ๆ มากมาย ดูที่นี่ - vim.org/scripts/script.php?script_id=39
amisax

@AmitKumar ขอบคุณสำหรับเคล็ดลับ ฉันจะดู!
Celada

9

บางทีนี่อาจจะง่ายขึ้นในสายตา:

[ condition ] && {
   # statement 1
   # statment 2
   # ...
}

นอกเหนือจากนั้นเพียงรับใช้มัน ใช้สำนวนภาษา


1
แต่แพ้ bashism ที่ไม่จำเป็นและมักจะใช้วงเล็บหนึ่งชุด
Josip Rodin

5

ต่อไปนี้อยู่ใกล้กับที่นั่น และแปลก

: if; { code; } && {
    code
}

โดยส่วนตัวฉันไม่ชอบ ...

if true; then
more;fi

... สร้างตัวเอง ผมชอบมันเมื่อคำควบคุมนำไปสู่ มันดูแปลกสำหรับฉันเสมอที่...;thenแบบฟอร์มที่ปรากฏขึ้นมาเลย

if    this && that
then  do these things too
else  i will probably get upset
fi

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


แบบฟอร์มที่แพร่หลายนี้ดูเหมือนจะเป็นอีกชาติหนึ่งที่พบได้ทั่วไปif(...) {นั่นคือการเปิดวงเล็บปีกกาในบรรทัดเดียวกับifภาษา C-like
Ruslan

@Ruslan - บางที - แต่บรรทัดไม่ได้สร้างความแตกต่างเลยใน C ใช่ไหม?
mikeserv

ใช่ แต่ตัวแบ่งบรรทัดไม่สร้างความแตกต่างในเชลล์ใช่ไหม อัฒภาคหลังจากเงื่อนไขทำให้ล่ามค้นหาความต่อเนื่องของifคำสั่งแม้ว่าในบรรทัดถัดไป
Ruslan

@Ruslan - ใช่ - คุณต้องใช้;delim ในกรณีนั้น นั่นเป็นเหตุผลที่พวกเขาทำ
mikeserv

การใช้:เชลล์บิวด์อินแบบนี้เพียงเพื่อให้บรรทัดของโค้ดสามารถอยู่ใกล้กับไวยากรณ์ C มากขึ้นไม่ควรสนับสนุนในลักษณะใด ๆ
Josip Rodin

0

นี่คือวิธี:

[ "$var" = "find" ] && echo "found"

เทียบเท่ากับ:

if [ "$var" = "find" ]; then
  echo "found"
fi

ในขณะที่เขากล่าวในคำถามที่เขาต้องการวงเล็บ วาง{...}ไปรอบ ๆecho "found"แล้วคุณจะมุ่งหน้าไปในทิศทางที่ถูกต้อง
Peter.O

-2

ฉันมักจะใช้:

if (code); then
   code;
fi

อาจไม่ใช่สิ่งที่คุณต้องการอย่างแน่นอน แต่มันก็เป็นอะไรที่มากกว่า


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