ทำไมคุณควรใส่ใจสิ่งที่ฉันพูดทั้งๆที่มีคำตอบ upvote 250+
มันไม่ได้ว่าและ0 = true
1 = false
มันเป็น: ศูนย์หมายความว่าไม่มีความล้มเหลว(ความสำเร็จ) และไม่ใช่ศูนย์หมายถึงความล้มเหลว(ประเภท N)
ในขณะที่คำตอบที่เลือกเป็นเทคนิค "true" กรุณาอย่าใส่return 1
** ในรหัสของคุณสำหรับการเท็จ มันจะมีผลข้างเคียงที่โชคร้ายหลายอย่าง
- นักพัฒนาที่มีประสบการณ์จะมองคุณเป็นมือสมัครเล่น (ด้วยเหตุผลด้านล่าง)
- นักพัฒนาที่มีประสบการณ์จะไม่ทำสิ่งนี้ (ด้วยเหตุผลทั้งหมดด้านล่าง)
- มันเป็นข้อผิดพลาดได้ง่าย
- แม้แต่นักพัฒนาที่มีประสบการณ์ก็สามารถเข้าใจผิดว่า 0 และ 1 ว่าผิดและจริงตามลำดับ (ด้วยเหตุผลข้างต้น)
- มันต้องการ (หรือจะสนับสนุน) ความคิดเห็นที่ไม่เกี่ยวข้องและไร้สาระ
- มีประโยชน์น้อยกว่าสถานะการส่งคืนโดยนัย
เรียนรู้ทุบตี
คู่มือทุบตีพูดว่า (ผมขอย้ำ)
คืน [n]
ทำให้ฟังก์ชันเชลล์หยุดการเรียกใช้งานและส่งกลับค่า n ไปยังผู้เรียก หากไม่ได้ระบุ nค่าส่งคืนคือสถานะออกของคำสั่งสุดท้ายที่ดำเนินการในฟังก์ชัน
ดังนั้นเราไม่จำเป็นต้องใช้ 0 และ 1 เพื่อระบุจริงและเท็จ ความจริงที่ว่าพวกเขาทำเช่นนั้นเป็นความรู้เล็กน้อยที่เป็นประโยชน์มีประโยชน์เฉพาะสำหรับการดีบักรหัสคำถามสัมภาษณ์และเป่าใจของมือใหม่
คู่มือทุบตียังบอกว่า
มิฉะนั้นสถานะการส่งคืนของฟังก์ชันคือสถานะออกของคำสั่งสุดท้ายที่ดำเนินการ
คู่มือทุบตียังบอกว่า
( $? ) จะขยายออกจากสถานะของท่อเบื้องหน้าส่วนใหญ่ดำเนินการเมื่อเร็ว ๆ นี้
เดี๋ยวก่อนรอ ท่อส่ง? ลองหันไปใช้คู่มือทุบตีอีกครั้ง
ไปป์ไลน์เป็นลำดับของคำสั่งอย่างน้อยหนึ่งคำคั่นด้วยหนึ่งในตัวดำเนินการควบคุม '|' หรือ '| &'
ใช่. พวกเขากล่าวว่า 1 คำสั่งเป็นไปป์ไลน์ ดังนั้นคำพูดทั้งสามคำพูดแบบเดียวกัน
$?
บอกสิ่งที่เกิดขึ้นล่าสุด
- มันฟองขึ้น
คำตอบของฉัน
ดังนั้นในขณะที่@Kambus แสดงให้เห็นว่าด้วยฟังก์ชั่นที่เรียบง่ายเช่นนี้ไม่return
จำเป็นเลย ฉันคิดว่ามันเรียบง่ายไม่สมจริงเมื่อเทียบกับความต้องการของคนส่วนใหญ่ที่จะอ่านสิ่งนี้
ทำไมreturn
?
หากฟังก์ชั่นกำลังจะกลับสถานะทางออกของคำสั่งสุดท้ายทำไมใช้return
เลย? เพราะมันทำให้ฟังก์ชั่นหยุดการทำงาน
หยุดการทำงานภายใต้เงื่อนไขหลายข้อ
01 function i_should(){
02 uname="$(uname -a)"
03
04 [[ "$uname" =~ Darwin ]] && return
05
06 if [[ "$uname" =~ Ubuntu ]]; then
07 release="$(lsb_release -a)"
08 [[ "$release" =~ LTS ]]
09 return
10 fi
11
12 false
13 }
14
15 function do_it(){
16 echo "Hello, old friend."
17 }
18
19 if i_should; then
20 do_it
21 fi
สิ่งที่เรามีที่นี่คือ ...
บรรทัด04
คือการคืนค่า [-ish] จริงเนื่องจาก RHS ของ&&
จะถูกเรียกใช้งานถ้า LHS เป็นจริงเท่านั้น
Line 09
ส่งคืนทั้งการจับคู่สถานะของสายจริงหรือเท็จ08
Line 13
ส่งคืน false เนื่องจากบรรทัด12
(ใช่สิ่งนี้สามารถเล่นกอล์ฟได้ แต่ตัวอย่างทั้งหมดถูกวางแผนไว้)
อีกรูปแบบทั่วไป
# Instead of doing this...
some_command
if [[ $? -eq 1 ]]; then
echo "some_command failed"
fi
# Do this...
some_command
status=$?
if ! $(exit $status); then
echo "some_command failed"
fi
แจ้งให้ทราบว่าการตั้งค่าstatus
ตัวแปร demystifies $?
ความหมายของ (แน่นอนคุณรู้ว่าสิ่งที่$?
หมายถึง แต่บางคนมีความรู้น้อยกว่าที่คุณจะต้อง Google มันบางวันยกเว้นว่ารหัสของคุณกำลังทำการซื้อขายที่ความถี่สูงแสดงความรักตั้งค่าตัวแปร) แต่ที่จริงเอาไปคือ "ถ้า ไม่มีสถานะ "หรือตรงกันข้าม" หากสถานะออก "สามารถอ่านออกเสียงได้และอธิบายความหมาย อย่างไรก็ตามสิ่งสุดท้ายอาจมีความทะเยอทะยานเล็กน้อยเพราะการเห็นคำexit
นั้นอาจทำให้คุณคิดว่ามันกำลังออกจากสคริปต์เมื่อในความเป็นจริงมันกำลังออกจาก$(...)
subshell
** หากคุณยืนยันการใช้return 1
งานที่ผิดพลาดฉันขอแนะนำให้คุณใช้อย่างน้อยreturn 255
แทน สิ่งนี้จะทำให้ตัวคุณเองในอนาคตหรือผู้พัฒนารายอื่นที่ต้องรักษารหัสของคุณเพื่อตั้งคำถามว่า "เพราะเหตุใดจึงเป็น 255" อย่างน้อยพวกเขาก็จะให้ความสนใจและมีโอกาสที่ดีกว่าในการหลีกเลี่ยงข้อผิดพลาด
function
คำหลัก,myfun() {...}
พอเพียง