คำสั่งหมายถึงอะไร "ทำอะไร" ในเงื่อนไขใน Bash?


180

บางครั้งเมื่อสร้างเงื่อนไขฉันต้องการรหัสเพื่อทำอะไรเช่นที่นี่ฉันต้องการ Bash ที่จะทำอะไรเมื่อ$aมีค่ามากกว่า "10" พิมพ์ "1" ถ้า$aน้อยกว่า "5" มิฉะนั้นพิมพ์ "2":

if [ "$a" -ge 10 ]
then
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

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

คำตอบ:


340

คำสั่ง no-op ในเชลล์คือ:(โคลอน)

if [ "$a" -ge 10 ]
then
    :
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

จากคู่มือทุบตี :

:(โคลอน)
ไม่ทำอะไรเลยนอกเหนือจากการขยายข้อโต้แย้งและทำการเปลี่ยนเส้นทาง สถานะการส่งคืนเป็นศูนย์


3
@SaintHax trueไม่มีก็ไม่ทำงาน มันสร้างไว้ในเปลือกหอยและไม่ทำอะไรเลย
Barmar

1
มันคือเชลล์ในตัว (คุณถูกต้อง) มันจะคืนค่าเป็นจริง (สถานะ 0) เช่นเดียวกับที่เป็นจริงและยากต่อการอ่าน Bash เป็นภาษา DevOps และถ้า:เขียนโดยใครบางคนในทีมของฉันฉันจะให้พวกเขาเปลี่ยนมัน
SaintHax

3
@SaintHax หากมีคนใช้trueในบริบทที่ไม่มีเงื่อนไขฉันต้องการให้พวกเขาเปลี่ยนมัน if trueไม่เป็นไรthen trueดูเหมือนผิด
Barmar

1
แน่นอนคุณก็สามารถเขียนรหัสเพื่อใช้แทนif ! condition; then do something; fi if condition; then :; else do something; fi
Barmar

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

38

คุณอาจจะสามารถใช้trueคำสั่ง:

if [ "$a" -ge 10 ]; then
    true
elif [ "$a" -le 5 ]; then
    echo "1"
else
    echo "2"
fi

อีกทางเลือกหนึ่งในกรณีตัวอย่างของคุณ (แต่ไม่จำเป็นต้องมีทุกที่) คือการสั่งซื้อ if / else:

if [ "$a" -le 5 ]; then
    echo "1"
elif [ "$a" -lt 10 ]; then
    echo "2"
fi

8
หากคุณไม่ได้ทดสอบผลลัพธ์ทั้งคู่trueและfalseไม่มีประสิทธิภาพเท่าที่สคริปต์เกี่ยวข้อง แต่โดยหลักการแล้วพวกเขาสามารถแยกเชลล์บางตัวที่ยอมรับไวยากรณ์นี้ได้ดังนั้นจึงอาจ:ดีกว่า
dmckee --- ผู้ดูแลอดีตลูกแมว

3
คำถามถูกติดแท็กทุบตี ในทุบตีtrueและfalseสร้างตัว สำหรับเปลือกหอยเก่าtrue, falseและแม้กระทั่ง:อาจจะมีคำสั่งภายนอก (แม้ว่าคุณอาจจะได้เห็นหลังเฉพาะในมากเปลือกหอยเก่า)
Keith Thompson

6
ฉันชอบ:เพียงเพราะชัดเจนว่าเจตนาคืออะไร
Freedom_Ben

9

แม้ว่าฉันจะไม่ได้ตอบคำถามดั้งเดิมเกี่ยวกับคำสั่ง no-op ปัญหามากมาย (ถ้าไม่มากที่สุด) เมื่อใครคิดว่า " ในสาขานี้ฉันไม่ต้องทำอะไร " สามารถข้ามได้โดยเพียงปรับโครงสร้างตรรกะเพื่อให้สาขานี้ชนะ ไม่เกิดขึ้น

ฉันพยายามที่จะให้กฎทั่วไปโดยใช้ตัวอย่าง OPs

ไม่ทำอะไรเลยเมื่อ $ a มากกว่า "10" พิมพ์ "1" ถ้า $ a น้อยกว่า "5" มิฉะนั้นให้พิมพ์ "2"

เราต้องหลีกเลี่ยงสาขาที่$aได้รับมากกว่า 10 ดังนั้นจึง$a < 10เป็นเงื่อนไขทั่วไปที่สามารถนำไปใช้กับแต่ละอื่น ๆ ตามเงื่อนไข

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

ดังนั้นตัวอย่าง OPs ที่มีกฎที่ใช้อาจถูกปรับโครงสร้างเป็น:

if [ "$a" -lt 10 ] && [ "$a" -le 5 ]
then
    echo "1"
elif [ "$a" -lt 10 ]
then
    echo "2"
fi

เพียงแค่การเปลี่ยนแปลงของข้างต้นล้อมรอบทุกอย่างใน$a < 10สภาพ:

if [ "$a" -lt 10 ]
then
    if [ "$a" -le 5 ]
    then
        echo "1"
    else
        echo "2"
    fi
fi

(สำหรับตัวอย่างเฉพาะนี้@Flimzys การปรับโครงสร้างจะดีกว่าแน่นอน แต่ฉันต้องการให้กฎทั่วไปสำหรับทุกคนที่ค้นหาวิธีการไม่ทำอะไรเลย)


5
เหตุผลหนึ่งที่บางคนอาจต้องการไม่มีตัวเลือกคือเมื่อเริ่มต้นโครงสร้างรหัสด้วยความคิดที่ว่าจะเพิ่ม "เพิ่มบางสิ่งที่นี่ในภายหลัง" โดยไม่ต้องมีผลข้างเคียงโดยไม่ตั้งใจ เช่นถ้ามีใครใส่ if-then-else-fi ใน. bashrc ถ้าคุณใส่ echo "put stuff here"มันจะทำให้การใช้งานที่ไม่ใช่การเข้าสู่ระบบบางส่วน (เช่น scp เสีย) และช่องว่าง / ความคิดเห็นเท่านั้นทำให้เกิดข้อผิดพลาดรันไทม์
Aphoid
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.