เหตุผลเดียวที่คุณต้องการใช้$?เป็นอาร์กิวเมนต์สำหรับ[คำสั่ง (ไม่ว่า[คำสั่งนั้นจะทำงานในส่วนเงื่อนไขของ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 โดยที่ifstatement นั้นไม่มีจุดหมายifคาดว่าจะมีคำสั่งและถ้าคำสั่งดังกล่าวส่งคืน0จะรันรหัสในบล็อก เพื่อif true; then echo hello; fiจะสะท้อนสวัสดีตั้งแต่คำสั่งกลับtrue0