พจนานุกรมทุบตีให้แผนที่แฮชและอาร์เรย์เชื่อมโยงในสคริปต์เปลือก Linux เราจะแสดงวิธีการใช้โครงสร้างข้อมูลที่ทรงพลังและมีประโยชน์เหล่านี้ในสคริปต์เปลือก Linux ของคุณเอง
ดอกกุหลาบโดยชื่ออื่น ๆ
ชื่อทางการสำหรับพจนานุกรมคืออาร์เรย์เชื่อมโยง พวกเขายังเรียกว่าตารางแฮชและแผนที่แฮช พวกเขาเป็นโครงสร้างข้อมูลที่ทำงานคล้ายกับอาร์เรย์ปกติ แต่มีความแตกต่างอย่างมีนัยสำคัญ
อาร์เรย์เป็นชุดของค่าข้อมูลที่เก็บไว้ในโครงสร้างข้อมูลเดียว ในการเข้าถึงค่าข้อมูลใด ๆ ที่เรียกว่าองค์ประกอบอาร์เรย์คุณต้องรู้ตำแหน่งของพวกเขาในอาร์เรย์ ตำแหน่งขององค์ประกอบอาร์เรย์ในอาร์เรย์เรียกว่าดัชนีดังนั้นอาร์เรย์ประเภทนี้เรียกว่าอาร์เรย์ที่จัดทำดัชนี พวกเขาเป็นประเภทของอาร์เรย์ที่ใช้กันมากที่สุด
อย่างไรก็ตามพวกเขามีข้อเสียเปรียบ คุณสามารถเข้าถึงองค์ประกอบอาร์เรย์ได้อย่างไรหากคุณไม่ทราบตำแหน่งภายในรายการ คุณต้องทำงานผ่านองค์ประกอบทั้งหมดในอาร์เรย์การทดสอบเพื่อดูว่าค่าที่ตำแหน่งนั้นเป็นสิ่งที่คุณกำลังมองหา
อาร์เรย์ที่เชื่อมโยงกันเอาชนะปัญหานั้น พวกเขาไม่ได้ใช้จำนวนเต็มเพื่อระบุองค์ประกอบอาร์เรย์ที่ไม่ซ้ำกัน พวกเขาใช้คำที่ไม่ซ้ำกันที่เรียกว่าคำหลัก คุณสามารถดึงค่าสำหรับองค์ประกอบอาร์เรย์โดยใช้คำหลักโดยไม่คำนึงถึงตำแหน่งที่อยู่ในอาร์เรย์ ด้วยอาร์เรย์ที่จัดทำดัชนีตัวเลขจำนวนเต็มที่แสดงถึงตำแหน่งภายในอาร์เรย์จะอยู่ในลำดับจากน้อยไปมาก คำหลักในอาร์เรย์เชื่อมโยงสามารถอยู่ในลำดับใดก็ได้
คุณสามารถค้นหาค่าในอาร์เรย์ที่เชื่อมโยงโดยการค้นหาด้วยคำหลัก ค้นหาคำและดึงข้อมูลที่เกี่ยวข้องกับการเลียนแบบการค้นหาคำในพจนานุกรมและค้นหาความหมายของมัน นั่นเป็นเหตุผลที่มีการเชื่อมโยงอาร์เรย์เป็นที่รู้จักกันในนามพจนานุกรม
Bash 4.0 หรือสูงกว่า
สนับสนุนอาร์เรย์ที่เชื่อมโยงกัน เปลือกหอยทุบตี รุ่น 4.0 หรือสูงกว่า หากคุณใช้การกระจาย Linux ปัจจุบันคุณควรจะปรับ ในการตรวจสอบรุ่น BASH ของคุณให้ใช้คำสั่งนี้:
Bash --version
เครื่องที่ใช้ในการวิจัยบทความนี้มีการติดตั้ง Bash 5.1.4 ดังนั้นเราจึงดีที่จะไป
หลักการพื้นฐาน
ในการสร้างอาร์เรย์ที่เชื่อมโยงกับบรรทัดคำสั่งเทอร์มินัลหรือในสคริปต์เราใช้คำสั่ง Bash Declare NS
-NS
(เชื่อมโยง) ตัวเลือกบอก Bash ว่านี่จะเป็นอาร์เรย์ที่เชื่อมโยงกันและไม่ใช่อาร์เรย์ที่จัดทำดัชนี
ประกาศตัวย่อของ
สิ่งนี้สร้างอาร์เรย์แบบเชื่อมโยงที่เรียกว่า "ตัวย่อ"
หากต้องการใส่ข้อมูลไว้ในอาร์เรย์ของเราเราต้องให้คำหลักและค่านิยม เราสามารถทำได้โดยใช้รูปแบบนี้:
อาร์เรย์ชื่อ [คีย์] = ค่า
ลองเพิ่มองค์ประกอบอาร์เรย์กัน:
Acronyms [ACK] = การตอบรับ
Acronyms [BGP] = "Protocol เกตเวย์ชายแดน"
ตัวย่อ [CIDR] = "การกำหนดเส้นทางอินเตอร์โดเมนแบบคลาสสิก"
Acronyms [DHCP] = "โปรโตคอลการกำหนดค่าโฮสต์แบบไดนามิก"
Acronyms [EOF] = "สิ้นสุดของเฟรม"
คำสั่งเหล่านั้นกำหนดองค์ประกอบอาร์เรย์ห้าองค์ประกอบ โปรดทราบว่าค่าถูกห่อในเครื่องหมายอัญประกาศหากมีช่องว่างในค่า คำหลักของเราถูกป้อนตามลำดับตัวอักษร แต่สามารถป้อนได้ทุกคำสั่งที่คุณชอบ คำหลักจะต้องไม่ซ้ำกัน หากคุณพยายามสร้างสองรายการที่มีคำหลักเดียวกันค่าที่สองที่คุณป้อนจะเขียนทับครั้งแรก คุณจะยังคงมีเพียงหนึ่งรายการด้วยคำหลักนั้นและมันจะเชื่อมโยงกับค่าที่สองที่คุณเพิ่ม
ในการดึงค่าจากอาร์เรย์เราใช้คำสั่งในรูปแบบนี้:
$ {array-name [key]}
เราสามารถใช้ Echo เพื่อส่งเอาต์พุตไปยังหน้าต่างเทอร์มินัล:
Echo $ {ย่อ [ACK]}
ECHO $ {ย่อ [DHCP]}
การใช้ลูป
อาร์เรย์ยืมตัวที่จะถูกนำมาใช้ในการวนลูปได้เป็นอย่างดี เชื่อมโยงอาร์เรย์จะไม่มีข้อยกเว้น ลูปให้วิธีที่มีประสิทธิภาพในการเรียกลำดับของการกระทำโดยไม่ซ้ำส่วนของโค้ด ก่อนที่เราจะมองไปที่ลูปมีวิธีที่มีประสิทธิภาพในการประกาศอาร์เรย์
เราสร้างอาร์เรย์โดยใช้
ประกาศ
คำสั่ง (เดียวกัน
-NS
ตัวเลือกที่เป็นมาก่อน) แต่เราให้คำหลักและค่านิยมเป็นรายการในบรรทัดคำสั่ง
ประเทศประกาศ -A = ([ALB] = แอลเบเนีย [BHR] = บาห์เรน [CMR] = แคเมอรูน [DNK] = เดนมาร์ก [EGY] = อียิปต์)
ชื่ออาร์เรย์คือ“ประเทศ” และมีการเชื่อมต่อไปยังรายการค่าด้วยเครื่องหมายเท่ากับ”
=
" รายการค่าจะถูกห่อในวงเล็บ“
()
” และคำหลักแต่ละห่อในวงเล็บ“
[]
“ ทราบว่ามีเครื่องหมายจุลภาคไม่มีการแยกค่า หากคุณมีค่าสตริงที่มีช่องว่างคุณจะต้องห่อไว้ในเครื่องหมายคำพูด
ที่จะทำให้อาเรย์กลับคำหลักที่แทนค่าเพิ่มเครื่องหมายอัศเจรีย์“
!
” หน้าชื่ออาร์เรย์ ที่สัญลักษณ์“
@
” สามารถนำมาใช้เป็นสัญลักษณ์แทนความหมายองค์ประกอบมากมายทั้งหมด
นี้
สำหรับ
ห่วงจะแสดงรายการทั้งหมดของคำหลัก:
สำหรับการสำคัญในการ "$ {ประเทศ [@]!}"; ทำ $ คีย์ก้อง; ทำ
หมายเหตุว่าคำหลักที่ไม่ได้ระบุไว้จำเป็นต้องอยู่ในลำดับที่พวกเขาสร้างขึ้น แต่ที่ไม่ได้เรื่อง เชื่อมโยงอาร์เรย์ไม่ต้องพึ่งพาดัชนีสั่งซื้อ
นอกจากนี้เรายังสามารถใช้การขยายตัวพารามิเตอร์รายการทั้งหมดของคำหลัก พวกเขาจะได้รับการจดทะเบียนในบรรทัดเดียวไม่ได้ต่อหนึ่งบรรทัด
echo "$ {! ประเทศ [@]}"
echo "$ {! ย่อ [@]}"
เราสามารถขยายของเรา
สำหรับ
ห่วงพิมพ์คำหลักและค่านิยมในเวลาเดียวกัน
สำหรับการสำคัญในการ "$ {ย่อ [@]!}"; ทำ echo "$ คีย์ - $ {ย่อ [$ คีย์]}"; ทำ
ถ้าเราต้องการที่จะทราบว่าหลายองค์ประกอบที่มีอยู่ในอาร์เรย์เราสามารถใช้กัญชา“#” ในหน้าชื่ออาร์เรย์แทนเครื่องหมายอัศเจรีย์
echo "$ {! ประเทศ [@]}"
echo "$ {! ย่อ [@]}"
การตรวจสอบว่าอาร์เรย์ธาตุที่มีอยู่
หากคุณค้นหาคำหลัก แต่ไม่มีองค์ประกอบอาร์เรย์เช่นค่าส่งกลับจะเป็นสตริงที่ว่างเปล่า บางครั้งก็เป็นประโยชน์ที่จะมีตัวบ่งชี้ที่แตกต่างกันสำหรับการมีหรือไม่มีขององค์ประกอบอาร์เรย์
เราสามารถตรวจสอบการปรากฏตัวขององค์ประกอบอาร์เรย์โดยใช้“
+ _
” ผู้ประกอบการ หมายเหตุที่ว่านี้เกิดขึ้นหลังจากคำหลักที่ไม่ได้อยู่ในหน้าชื่ออาร์เรย์เช่นผู้ประกอบการก่อนหน้านี้เราเคยเห็น
ถ้า [$ {ย่อ [EOF] + _}]; แล้ว echo "พบ"; อื่น echo "ไม่พบ"; ไฟ
ถ้า [$ {ย่อ [FTP] + _}]; แล้ว echo "พบ"; อื่น echo "ไม่พบ"; ไฟ
องค์ประกอบอาร์เรย์ที่มีคำว่า“EOF” พบในอาร์เรย์ แต่องค์ประกอบอาร์เรย์ที่มีคำว่า“FTP” ไม่ได้เป็น
เพิ่มองค์ประกอบมากมาย
เพิ่มองค์ประกอบใหม่ให้กับอาร์เรย์เชื่อมโยงเป็นเรื่องง่าย ไม่เหมือนบางภาษาโปรแกรมที่คุณไม่จำเป็นต้องกำหนดขนาดของอาร์เรย์ของคุณเมื่อคุณประกาศว่า คุณสามารถเก็บเพิ่มองค์ประกอบใหม่โดยไม่ต้องกดปุ่มขีด จำกัด บนที่กำหนดไว้ล่วงหน้า
ในการเพิ่มองค์ประกอบใหม่ไปยังอาร์เรย์ที่เราใช้“
+ =
” ผู้ประกอบการ
ประเทศ + = ([FJI] = ฟิจิ)
echo "$ (# ประเทศ [@]}"
echo $ {ประเทศ [FJI]}
จำนวนขององค์ประกอบในอาร์เรย์คือตอนนี้หกและค้นหาคำหลักใหม่พบว่าองค์ประกอบอาร์เรย์และผลตอบแทนคุ้มค่า
การลบองค์ประกอบมากมายและอาร์เรย์
NS
ไม่มีการตั้งค่า
คำสั่งที่ใช้ในการลบองค์ประกอบมากมาย หากคำหลักมีช่องว่างในนั้นห่อไว้ในเครื่องหมายคำพูด
ล้างคำย่อ [EOF]
ถ้า [$ {ย่อ [EOF] + _}]; แล้ว echo "พบ"; อื่น echo "ไม่พบ"; ไฟ
ในการลบอาร์เรย์ทั้งหมดใช้
ไม่มีการตั้งค่า
ที่มีชื่อของอาร์เรย์
ประเทศล้าง
การใช้ตัวแปรกับอาร์เรย์
ใช้ตัวแปรที่มีเชื่อมโยงอาร์เรย์ตรงไปตรงมา ในตัวอย่างนี้เราจะตั้งค่าคีย์ตัวแปรสตริง“EOF.” เราจะใช้ตัวแปรเมื่อเราเพิ่มองค์ประกอบอาร์เรย์ใหม่เพื่ออาร์เรย์ ที่จริงเรากำลังแทนที่องค์ประกอบอาร์เรย์ที่เราลบก่อนหน้านี้
เราจะดึงองค์ประกอบอาร์เรย์ใหม่โดยเรียกใช้กับคำหลักใหม่และโดยใช้ตัวแปร หากคำหลักมีช่องว่างคุณจะต้องปิดชื่อตัวแปรในเครื่องหมายอัญประกาศ
Key = EOF
ตัวย่อ [$ key] = "สิ้นสุดของเฟรม"
Echo $ {ย่อ [EOF]}
Echo $ {ย่อ [$ key]}
รับความคิดสร้างสรรค์
ตัวอย่างของเราได้รับการรวบรวมข้อมูลที่องค์ประกอบอาร์เรย์แต่ละองค์ประกอบนั้นเป็นอิสระจากทุกคนอื่น ๆ เช่นพจนานุกรม แต่ละอันเป็นคำจำกัดความที่เป็นเอกลักษณ์ แต่อาร์เรย์ที่เชื่อมโยงกันสามารถเก็บข้อมูลที่หลากหลายทั้งหมดที่เกี่ยวข้องกับสิ่งหนึ่งเช่นข้อมูลจำเพาะของชิ้นส่วนต่าง ๆ ของฮาร์ดแวร์คอมพิวเตอร์:
ประกาศ - ข้อมูลจำเพาะของ
ข้อมูลจำเพาะ [CPU] = "Dual Core AMD Ryzen 5 3600"
ข้อมูลจำเพาะ [Speed] = "3600 MHz"
ข้อมูลจำเพาะ [เคอร์เนล] = "5.11.0-17-generic x86_64"
ข้อมูลจำเพาะ [MEM] = "1978.5 MIB"
ข้อมูลจำเพาะ [เก็บข้อมูล] = "32 Gib"
ข้อมูลจำเพาะ [เชลล์] = "Bash"
echo $ {specification [cpu]}
การเขียนอย่างมีประสิทธิภาพในภาษาหมายถึงการรู้กลไกและโครงสร้างที่มีให้และเลือกหนึ่งที่เหมาะสมที่สุดสำหรับปัญหาที่คุณพยายามแก้ไข Associative Arrays ให้วิธีการจัดเก็บข้อมูลที่ใช้งานง่ายที่คุณสามารถค้นหาได้ตามชื่อเช่นเดียวกับพจนานุกรม