ปัญหากับคำตอบอื่น ๆ ก็คือพวกเขาอาจใช้ทั่วโลกซึ่งสามารถเขียนทับเมื่อฟังก์ชั่นหลายอย่างอยู่ในสายโซ่หรือecho
ซึ่งหมายความว่าฟังก์ชั่นของคุณไม่สามารถส่งออกข้อมูลการวินิจฉัย (คุณจะลืมฟังก์ชั่นของคุณ มูลค่าจะมีข้อมูลมากกว่าที่ผู้โทรของคุณคาดว่าจะนำไปสู่ข้อผิดพลาดที่แปลก) หรือeval
หนักเกินไปและแฮ็ค
วิธีที่เหมาะสมในการทำเช่นนี้คือการวางสิ่งของระดับบนสุดไว้ในฟังก์ชันและใช้local
กฎการกำหนดขอบเขตแบบไดนามิกของ bash ตัวอย่าง:
func1()
{
ret_val=hi
}
func2()
{
ret_val=bye
}
func3()
{
local ret_val=nothing
echo $ret_val
func1
echo $ret_val
func2
echo $ret_val
}
func3
ผลลัพธ์นี้
nothing
hi
bye
การกำหนดขอบเขตแบบไดนามิกหมายถึงการret_val
ชี้ไปยังวัตถุอื่นที่แตกต่างกันไปตามผู้โทร! สิ่งนี้แตกต่างจากการกำหนดขอบเขตคำศัพท์ซึ่งเป็นสิ่งที่ภาษาการเขียนโปรแกรมส่วนใหญ่ใช้ นี่เป็นคุณลักษณะที่มีการบันทึกไว้ง่าย ๆ ที่จะพลาดและไม่ได้อธิบายได้ดีนี่คือเอกสารสำหรับมัน (การเน้นคือของฉัน):
ตัวแปรท้องถิ่นฟังก์ชั่นอาจมีการประกาศด้วย builtin ท้องถิ่น ตัวแปรเหล่านี้จะปรากฏเฉพาะกับฟังก์ชั่นและคำสั่งมันจะเรียก
สำหรับผู้ที่มีพื้นหลัง C / C ++ / Python / Java / C # / javascript นี่อาจเป็นอุปสรรค์ที่ยิ่งใหญ่ที่สุด: ฟังก์ชั่นใน bash ไม่ใช่ฟังก์ชั่นพวกเขาเป็นคำสั่งและประพฤติเช่น: พวกเขาสามารถส่งออกไปstdout
/ stderr
พวกเขาสามารถ / out พวกเขาสามารถส่งคืนรหัสออกได้ โดยทั่วไปจะไม่มีความแตกต่างระหว่างการกำหนดคำสั่งในสคริปต์และการสร้างโปรแกรมที่สามารถเรียกได้จากบรรทัดคำสั่ง
ดังนั้นแทนที่จะเขียนสคริปต์ของคุณเช่นนี้:
top-level code
bunch of functions
more top-level code
เขียนแบบนี้:
# define your main, containing all top-level code
main()
bunch of functions
# call main
main
ที่main()
ประกาศret_val
เป็นlocal
และฟังก์ชั่นอื่น ๆ ret_val
ทั้งหมดกลับค่าผ่านทาง
ดูเพิ่มเติมดังต่อไปนี้ Unix และ Linux คำถาม: ขอบเขตของตัวแปรท้องถิ่นในฟังก์ชั่นเชลล์
อีกวิธีการแก้ปัญหาอาจดียิ่งขึ้นขึ้นอยู่กับสถานการณ์เป็นหนึ่งโพสต์โดย ya.tecklocal -n
ซึ่งการใช้งาน
return
ในกรณีของคุณเป็นหลักเช่นเดียวกับซึ่งมีตั้งแต่exit code
0 - 255
ใช้echo
ตามที่แนะนำโดย @septi$?
รหัสออกสามารถจับกับ