Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เชี่ยวชาญ Bash Associative Arrays: ควบคุมข้อมูลของคุณได้อย่างมีประสิทธิภาพ

บทนำ

หากคุณเคยเขียนโค้ด ไม่ว่าจะเป็น shell script, Python script, C++, หรือแม้แต่ Scratch คุณจะรู้ว่า variables สำคัญมาก คอมพิวเตอร์และโปรแกรมเมอร์ใช้ variables เป็นสถานีกลาง ที่พวกเขาส่งข้อมูลไปมาอย่างลับๆ ตัวอย่างเช่น หากคุณต้องประมวลผลชื่อผู้ใช้ใน shell script คุณอาจตั้งตัวแปร ใส่ username ลงไป แล้วสั่งคอมพิวเตอร์ทำบางอย่างกับตัวแปร (เช่นตรวจสอบกับรายชื่อผู้ใช้ที่ได้รับอนุญาต) Variables สำคัญเพราะทำให้โค้ดเป็น dynamic: พวกมันเป็น placeholders สำหรับข้อมูลที่คาดว่าจะเปลี่ยนทุกครั้งที่รันโค้ด

แต variables เนื่องจากพวกมันพบได้บ่อย จึงอาจกลายเป็นสิ่งที่ควบคุมยาก บ่อยครั้ง คุณรวบรวม variables มากมายในโปรเจคโค้ด จนเกือบไม่สามารถติดตามทั้งหมดได้ คุณสามารถใช้ conventions ที่ฉลาด เช่น 加前綴ให้ variables ที่เกี่ยวข้องทั้งหมดด้วยสตริงร่วมกัน (user_name, user_pass, user_time, และต่อไป) หรือสร้าง master list ไว้ที่หนึ่งสำหรับอ้างอิงง่าย แต่ overhead ในการติดตามทั้งหมดอาจเป็นภาระ

คำตอบหนึ่งต่อปัญหานี้แบบดั้งเดิมคือ arrays ซึ่งทำงานได้ดีในภาษาเขียนโค้ดส่วนใหญ่ รวมถึง shell scripting languages เช่น Bash

ส่วนใหญ่ shells ให้สร้าง จัดการ และสืบค้น indexed arrays ในภาษาไทยง่ายๆ indexed array คือรายการสิ่งต่างๆ นำหน้าด้วยตัวเลข รายการนี้พร้อมตัวเลขที่กำหนด ถูกรวมอยู่ในตัวแปรเดียว ทำให้ "พกพา" ระหว่างโค้ดได้ง่าย

Bash แต่รวมถึงความสามารถในการสร้าง associative arrays และจัดการเหมือน array อื่นๆ associative array ให้คุณสร้างรายการ key-value pairs แทนค่าเฉพาะที่มีหมายเลข

คุณสามารถกำหนดค่าให้ keys แบบ arbitrary:

$ declare -A userdata
$ userdata[name]=seth
$ userdata[pass]=8eab07eb620533b083f241ec4e6b9724
$ userdata[login]=`date --utc +%s`

สืบค้น key ใดๆ:

$ echo "${userdata[name]}"
seth
$ echo "${userdata[login]}"
1583362192

การดำเนินการ array ทั่วไปส่วนใหญ่ที่คุณคาดหวังมีให้ใช้งาน ตัวอย่าง คุณสามารถแสดงค่าทั้งหมด:

$ echo "${userdata[*]}"
8eab07eb620533b083f241ec4e6b9724 seth 1583362192

คุณสามารถดู array ทั้งหมด:

$ typeset -A
declare -A BASH_ALIASES='()'
declare -A BASH_CMDS='()'
declare -A userdata='([pass]="8eab07eb620533b083f241ec4e6b9724"
[name]="seth"
[login]="1583362192" )'

คุณยังสามารถลบไอเท็มจาก array ด้วยคำสั่ง unset:

$ unset userdata[pass]
$ typeset -A
[...]
declare -A userdata='([name]="seth"
[login]="1583362192" )'

สุดท้าย คุณสามารถ dismiss ทั้ง array ได้

$ unset "userdata[*]"

Arrays สำหรับข้อมูล

Arrays เป็นเครื่องมือที่มีประโยชน์สำหรับเก็บข้อมูลที่เกี่ยวข้องร่วมกัน คุณสามารถใช้ plain variable ในส่วนใหญ่ แต่บางครั้งสมเหตุสมผลกว่าที่จะเก็บ attributes ของ "object" ข้อมูลเดี่ยวใน array เพื่อรวมข้อมูลและทำดัชนี ตัวอย่างเช่น หากคุณประมวลผล login names และเวลาจาก utmp จะมีประโยชน์มากกว่าที่จะ associate เวลา login กับผู้ใช้ที่เวลานั้นหมายถึง แทนที่จะเก็บ object ข้อมูลสองตัวแยกกันโดยไม่มีการเชื่อมโยงที่ชัดเจน

เพิ่มเติม ความแตกต่างจาก variables รายการใน array ไม่ต้องมีอยู่ก่อนที่คุณจะเก็บข้อมูลลงไป คุณไม่ต้องรู้แน่ชัดว่าจะมีข้อมูลเท่าไหร่ก่อนเก็บ นี่อาจเป็นข้อได้เปรียบใหญ่หากคุณประมวลผลข้อมูลที่คุณควบคุมหรือคาดการณ์ไม่ได้: หากคุณไม่รู้ว่ามีผู้ใช้กี่คนใน utmp วันต่อวัน มันยากที่จะสร้างสคริปต์ที่บรรจุทุก entry ด้วย array แค่ declare array เดียว แล้วอ่านข้อมูลเข้าไป สร้าง key-value pair ใหม่จนกว่าจะหมดข้อมูล

Arrays ทรงพลัง และพบได้ทั่วไปในภาษาเขียนโปรแกรมเหนือกว่า Bash เริ่มใช้พวกมันวันนี้!