เหตุผลเดียวที่คุณต้องการใช้$?
เป็นอาร์กิวเมนต์สำหรับ[
คำสั่ง (ไม่ว่า[
คำสั่งนั้นจะทำงานในส่วนเงื่อนไขของif
คำสั่งหรือไม่) คือเมื่อคุณต้องการแยกแยะสถานะการส่งคืนเฉพาะเช่น:
until
cmd
[ "$?" -gt 1 ]
do
something
done
ไวยากรณ์สำหรับทุกคนif
, while
, until
... เป็นงบ
if cmd-list1
then cmd-list2
else cmd-list3
fi
ซึ่งทำงานcmd-list2
หากcmd-list1
ประสบความสำเร็จหรือcmd-list3
อย่างอื่น
[ "$?" -eq 0 ]
คำสั่งเป็น no-op มันตั้งค่า$?
เป็น 0 ถ้า$?
เป็น 0 และ$?
ไม่ใช่ศูนย์ถ้ามันไม่ใช่ศูนย์
หากคุณต้องการเรียกใช้บางสิ่งหากcmd
ล้มเหลวนั่นคือ:
if ! cmd
then ...
fi
โดยทั่วไปแล้วคุณไม่จำเป็นต้องมีคนจรจัด$?
นับประสาทราบว่าค่าวิธีการหรือtrue
false
มีเพียงกรณีเดียวที่ฉันได้กล่าวไว้ข้างต้นหากคุณต้องการแยกแยะค่าเฉพาะหรือถ้าคุณต้องการบันทึกไว้ในภายหลัง (เช่นเพื่อส่งคืนเป็นค่าส่งคืนของฟังก์ชัน) เช่น:
f() {
cmd; ret=$?
some cleanup
return "$ret"
}
นอกจากนี้โปรดจำไว้ว่าการปล่อยตัวแปรที่ไม่ได้ระบุไว้คือตัวดำเนินการ + glob ไม่เหมาะสมที่จะเรียกใช้ตัวดำเนินการที่นี่ดังนั้นควร:
[ "$?" -ne 0 ]
ไม่[ $? -ne 0 ]
ปล่อยให้อยู่คนเดียว[$? -ne 0 ]
(ซึ่งจะเรียกใช้[
คำสั่งหาก$IFS
มีอักขระตัวแรกของ$?
)
นอกจากนี้โปรดทราบว่าวิธี Bourne ในการกำหนดฟังก์ชั่นคือติดfunction-name()
หน้าคำสั่ง เป็นกรณีที่ในทุกบอร์นเหมือนเปลือกยกเว้นbash
และyash
(และรุ่นล่าสุดของposh
) ซึ่งเพียง แต่ช่วยให้คำสั่งผสม (คำสั่งผสมเป็น{...}
หรือ(...)
หรือสิ่งที่ต้องการfor...done
, if...fi
...
function foo { ... }
เป็นksh
ไวยากรณ์นิยามฟังก์ชัน ไม่มีเหตุผลใดที่คุณต้องการใช้ที่นี่
รหัสของคุณสามารถเขียนได้แบบพกพา (POSIXly):
foo() (
cd -P -- "$FOOBAR" || return # what if the cd failed!
if
<some command>
then
echo 'OK!'
else
echo 'Nope!'
fi
)
นอกจากนี้โปรดทราบว่าcd
หากไม่มี-P
ความหมายพิเศษมาก (จัดการเส้นทางที่มี..
ส่วนประกอบแตกต่างจากคำสั่งอื่น ๆ ) ดังนั้นควรรวมไว้ในสคริปต์เพื่อหลีกเลี่ยงความสับสน
(ฟังก์ชั่นนั้นคืนfalse
ถ้าcd
ล้มเหลว แต่ไม่ใช่ถ้า<some command>
ล้มเหลว)
$?
เท่ากับ 0 โดยที่if
statement นั้นไม่มีจุดหมายif
คาดว่าจะมีคำสั่งและถ้าคำสั่งดังกล่าวส่งคืน0
จะรันรหัสในบล็อก เพื่อif true; then echo hello; fi
จะสะท้อนสวัสดีตั้งแต่คำสั่งกลับtrue
0