Cách sử dụng Mảng trong Bash Script
Giống như hầu hết các ngôn ngữ lập trình, tập lệnh bash đôi khi cần xử lý một danh sách các giá trị liên quan. Dạng đơn giản nhất là mảng chuẩn.
Trong bash, lập trình mảng khá khác biệt, đặc biệt là về cú pháp. Mảng bash cũng hoàn toàn là một chiều, nhưng chúng vẫn có nhiều công dụng.
Mục Lục
Cú pháp cơ bản của mảng Bash
Tạo một mảng trong bash rất đơn giản. Bạn có thể khởi tạo toàn bộ một mảng bằng cách sử dụng dấu ngoặc, ví dụ:
city=(London Paris Milan "New York")
(Bạn có thể tìm thấy tất cả mã từ ví dụ thành phố này trong GitHub Gist này.)
Điều này tạo ra một mảng chứa bốn phần tử, được đánh chỉ mục từ 0 đến 3. Lưu ý rằng giá trị thứ tư là một chuỗi được trích dẫn bao gồm hai từ. Bạn sẽ cần phải trích dẫn các giá trị có chứa khoảng trắng để làm rõ rằng chúng không phải là các giá trị riêng biệt.
Bạn có thể truy cập một phần tử duy nhất bằng cách sử dụng cú pháp ngoặc vuông phổ biến trên các ngôn ngữ lập trình:
city[2]
Vì đây là bash, bạn sẽ cần một vài sàng lọc để thực sự sử dụng giá trị trong một biểu thức:
- Bạn sẽ cần thêm ký hiệu đô la ($) vào tên biến.
- Bạn cũng sẽ cần sử dụng niềng răng ({}) để làm cho tên biến rõ ràng. Theo mặc định, bash sẽ xử lý $ thành phố[2] như một biến có tên thành phố. Thêm dấu ngoặc nhọn để nói với bash để đánh giá các dấu ngoặc và số chỉ mục.
Cú pháp truy cập mảng bash tiêu chuẩn sau đó là:
${variable_name[index]}
Đây là một ví dụ đầy đủ:
#!/bin/bashcity=(London Paris Milan "New York")
echo ${city[3]}
# New York
Thay vì khởi tạo tất cả một mảng cùng một lúc, bạn có thể chỉ định từng bước cho nó. Tập lệnh này tương đương với ví dụ trước đó:
#!/bin/bashcity[0]=London
city[1]=Paris
city[2]=Milan
city[3]="New York"
echo ${city[3]}
# New York
Lưu ý rằng, trong cả hai trường hợp, bạn cần phải cẩn thận không thêm bất kỳ khoảng trắng nào xung quanh dấu bằng. “thành phố[0] = London ”, với khoảng trắng xung quanh dấu bằng, sẽ tạo ra lỗi.
Sử dụng nhiều hơn cho mảng Bash
Mảng hoàn hảo để lưu trữ dữ liệu liên quan. Đây là một script shell (rất hạn chế) để lấy căn bậc hai của một số:
#!/bin/bashsqrt[1]=1
sqrt[4]=2
sqrt[9]=3
sqrt[16]=4
sqrt[25]=5
echo ${sqrt[$1]}
Lưu ý rằng tập lệnh sử dụng giá trị $ 1 dưới dạng chỉ số mảng. $ 1 đại diện cho đối số dòng lệnh đầu tiên mà tập lệnh nhận được, vì vậy bạn có thể chạy tập lệnh này như sau:
$ ./sqrt.sh 9
3
Bạn có thể biết về $ (cmd) cú pháp để thực hiện một lệnh và lưu đầu ra của nó trong một biến. Bạn có thể kết hợp điều này với cú pháp khởi tạo mảng để có được một mảng tệp để làm việc với:
arr=( $(ls) )
Một mảng thường là một cấu trúc dữ liệu hoàn hảo để lặp lại và Bash không phải là ngoại lệ. Bạn có thể lặp qua một mảng để in mọi phần tử hoặc thực hiện một thao tác trên mọi thành viên.
Bạn có thể giải quyết một mảng trong một tại vòng lặp, để lặp lại nội dung của nó. Ví dụ: đây là một vòng lặp đơn giản in số dòng trong mỗi tệp trong mảng arr:
for file in "${arr[@]}"; do
wc -l "$file"
done# 3 envvars
# 547 httpd.conf
# ...
Lưu ý rằng mẫu này sử dụng @ biểu tượng để lấy tất cả các phần tử từ mảng.
Thêm cú pháp mảng Bash
Bạn có thể lấy số lượng mục trong một mảng bằng cách sử dụng như sau:
echo ${#city[@]}# 4
Bạn có thể thêm một phần tử mới vào cuối một mảng tiêu chuẩn như sau:
arr+=(4)
Vì vậy, để thêm một thành phố thứ năm vào danh sách:
city+=(Rome)
echo ${city[@]}# London Paris Milan New York Rome
Để trích xuất một phần của một mảng, bạn có thể sử dụng cú pháp gần đúng với hoạt động lát của nhiều ngôn ngữ khác:
${arr[@]:s:n}
Cú pháp này sẽ trả về một phần của mảng bắt đầu từ vị trí S và chứa N mặt hàng. Bạn có thể bỏ qua :N một phần để trích xuất tất cả các mục từ S cho đến cuối danh sách.
echo ${city[@]:2:2}
# Milan New Yorkecho ${city[@]:3}
# New York Rome
Bash có nhiều tính năng, họ chỉ cần học một số
Mảng trong bash có thể có những hạn chế, nhưng chúng cung cấp chức năng cơ bản giống như hầu hết các ngôn ngữ lập trình. Mặc dù trước đây bash chỉ hỗ trợ các mảng một chiều đơn giản, nhưng thời gian đang thay đổi. Phiên bản mới nhất của bash, 4, hỗ trợ mảng liên kết và lập chỉ mục mảng phủ định.
Cho dù bạn đang sử dụng phiên bản bash nào, điều quan trọng là phải hiểu các sắc thái của nó. Ngay cả cú pháp biến bình thường cũng có nhiều đặc điểm riêng.
Đọc tiếp
Giới thiệu về tác giả