Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Kiểm soát dữ liệu của bạn bằng các mảng liên kết trong Bash

Nếu bạn đã từng viết mã, cho dù đó là tập lệnh shell, tập lệnh Python, C ++ hay thậm chí là Scratch, thì bạn biết rằng các biến rất quan trọng. Máy tính và người viết mã sử dụng các biến làm cách thức, nơi chúng lén lút truyền thông tin qua lại. Ví dụ:nếu bạn cần xử lý tên người dùng trong tập lệnh shell, bạn có thể thiết lập một biến, đặt tên người dùng vào biến, sau đó hướng dẫn máy tính thực hiện một điều gì đó với biến (kiểm tra nó với danh sách người dùng được ủy quyền , Ví dụ). Các biến rất quan trọng vì chúng cho phép mã hoạt động:chúng là trình giữ chỗ cho thông tin dự kiến ​​sẽ thay đổi mỗi khi bạn chạy mã.

Nhưng các biến, bởi vì chúng quá phổ biến, cũng có thể trở nên khá khó sử dụng. Thông thường, bạn thu thập quá nhiều biến trong một dự án mã đến nỗi không thể theo dõi tất cả chúng. Bạn có thể sử dụng các quy ước thông minh, chẳng hạn như đặt tiền tố cho tất cả các biến có liên quan bằng một chuỗi chung (user_name, user_pass, user_time, v.v.) hoặc bạn có thể tạo một danh sách chính của chúng ở đâu đó để dễ dàng tham khảo, nhưng chi phí của việc theo dõi nó tất cả đều có thể trở thành đánh thuế.

Một câu trả lời cho vấn đề này, theo truyền thống, là các mảng. Chúng hoạt động tốt trong hầu hết các ngôn ngữ mã hóa, bao gồm cả các ngôn ngữ kịch bản shell như Bash.

Hầu hết các trình bao cung cấp khả năng tạo, thao tác và truy vấn các mảng được lập chỉ mục. Trong tiếng Anh đơn giản, một mảng được lập chỉ mục là danh sách những thứ có tiền tố là một số. Danh sách những thứ này, cùng với số được chỉ định, được gói gọn trong một biến duy nhất một cách thuận tiện, giúp bạn dễ dàng "mang theo" mã của mình.

Tuy nhiên, Bash bao gồm khả năng tạo các mảng liên kết và nó xử lý các mảng này giống như bất kỳ mảng nào khác. Mảng kết hợp cho phép bạn tạo danh sách các cặp khóa và giá trị, thay vì chỉ các giá trị được đánh số.

Bạn có thể gán giá trị cho các khóa tùy ý:

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

Truy vấn bất kỳ khóa nào:

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

Hầu hết các hoạt động mảng thông thường mà bạn mong đợi từ một mảng đều có sẵn. Ví dụ:bạn có thể liệt kê tất cả các giá trị:

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

Bạn có thể xem toàn bộ mảng:

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

Bạn cũng có thể xóa các mục khỏi mảng của mình bằng cách sử dụng nút chưa đặt lệnh:

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

Cuối cùng, bạn có thể loại bỏ toàn bộ mảng.

$ unset "userdata[*]"

Mảng dữ liệu

Mảng là công cụ hữu ích để lưu trữ các dữ liệu liên quan với nhau. Bạn có thể sử dụng một biến cũ thuần túy trong hầu hết các trường hợp, nhưng đôi khi sẽ hợp lý hơn khi lưu trữ các thuộc tính của một "đối tượng" dữ liệu đơn lẻ trong một mảng, để giữ cho dữ liệu được hợp nhất và lập chỉ mục. Ví dụ:nếu bạn đang xử lý tên đăng nhập và thời gian được lấy từ utmp , sẽ hữu ích hơn cho bạn khi liên kết thời gian đăng nhập với người dùng mà thời gian đã giới thiệu, thay vì chỉ lưu trữ hai đối tượng dữ liệu dưới dạng các biến riêng biệt không có kết nối rõ ràng.

Hơn nữa, không giống như các biến, một mục nhập trong một mảng không cần phải tồn tại trước khi bạn lưu trữ dữ liệu trong đó. Bạn không cần phải biết chính xác lượng dữ liệu sẽ được lưu trữ trước khi bạn lưu trữ. Đó có thể là một lợi thế lớn nếu bạn đang xử lý dữ liệu mà bạn không thể kiểm soát hoặc dự đoán:nếu bạn không biết có bao nhiêu người dùng mong đợi trong utmp ngày này sang ngày khác, thật khó để xây dựng một kịch bản để chứa tất cả các mục. Tuy nhiên, với một mảng, tất cả những gì bạn phải làm là khai báo một mảng và đọc dữ liệu vào đó, tạo một cặp khóa và giá trị mới cho đến khi bạn hết dữ liệu để nhập.

Mảng rất mạnh và chúng phổ biến trong các ngôn ngữ lập trình ngoài Bash. Bắt đầu sử dụng chúng ngay bây giờ!