Làm thế nào để vượt qua các đối số cho một Bash-Script

Lệnh, cú pháp và ví dụ

Bạn có thể viết một tập lệnh bash sao cho nó nhận các đối số được chỉ định khi kịch bản được gọi từ dòng lệnh. Phương pháp này được sử dụng khi một tập lệnh phải thực hiện một chức năng hơi khác nhau tùy thuộc vào giá trị của tham số đầu vào (đối số).

Ví dụ, bạn có thể có một kịch bản được gọi là "stats.sh" thực hiện một hoạt động cụ thể trên một tập tin, chẳng hạn như đếm từ của nó. Nếu bạn muốn có thể sử dụng tập lệnh đó trên nhiều tệp, tốt nhất bạn nên chuyển tên tệp làm đối số, để bạn có thể sử dụng cùng một tập lệnh cho tất cả các tệp sẽ được xử lý. Ví dụ: nếu tên của tệp được xử lý là "danh sách bài hát", bạn sẽ nhập dòng lệnh sau:

sh stats.sh danh sách bài hát

Các đối số được truy cập bên trong một kịch bản bằng cách sử dụng các biến $ 1, $ 2, $ 3, vv, trong đó $ 1 đề cập đến đối số đầu tiên, $ 2 cho đối số thứ hai, v.v. Điều này được minh họa trong ví dụ sau đây:

FILE1 = $ 1 wc $ FILE1

Để dễ đọc, gán một biến với một tên mô tả cho giá trị của đối số đầu tiên ($ 1), và sau đó gọi tiện ích đếm từ ( wc ) trên biến này ($ FILE1).

Nếu bạn có một số biến đối số, bạn có thể sử dụng biến "$ @", là một mảng của tất cả các tham số đầu vào. Điều này có nghĩa là bạn có thể sử dụng vòng lặp for để xử lý lặp lại từng cái một, như được minh họa trong ví dụ sau:

cho FILE1 trong "$ @" làm wc $ FILE1 được thực hiện

Đây là một ví dụ về cách gọi kịch bản lệnh này với các đối số từ dòng lệnh:

sh stats.sh songlist1 songlist2 songlist3

Nếu một đối số có dấu cách, bạn cần phải kèm theo nó với dấu nháy đơn. Ví dụ:

sh stats.sh 'danh sách bài hát 1' 'danh sách bài hát 2' 'danh sách bài hát 3'

Thường xuyên một kịch bản được viết như vậy mà người dùng có thể vượt qua trong các đối số trong bất kỳ thứ tự nào bằng cách sử dụng cờ. Với phương thức cờ, bạn cũng có thể thực hiện một số đối số tùy chọn.

Giả sử bạn có tập lệnh truy xuất thông tin từ cơ sở dữ liệu dựa trên các thông số được chỉ định, chẳng hạn như "tên người dùng", "ngày" và "sản phẩm" và tạo báo cáo theo "định dạng" được chỉ định. Bây giờ bạn muốn viết kịch bản của bạn để bạn có thể truyền vào các tham số này khi kịch bản được gọi. Nó có thể trông như thế này:

makereport -u jsmith -p máy tính xách tay -d 10-20-2011 -f pdf

Bash cho phép chức năng này với chức năng "getopts". Đối với ví dụ trên, bạn có thể sử dụng getopts như sau:

Đây là một vòng lặp while sử dụng hàm "getopts" và cái gọi là "optstring", trong trường hợp này là "u: d: p: f:", để lặp qua các đối số. Vòng lặp while đi qua chuỗi quang, chứa các cờ có thể được sử dụng để chuyển các đối số và gán giá trị đối số được cung cấp cho cờ đó cho biến "tùy chọn". Trường hợp-tuyên bố sau đó gán giá trị của biến "tùy chọn" cho một biến toàn cầu có thể được sử dụng sau khi tất cả các đối số đã được đọc.

Dấu hai chấm trong chuỗi có nghĩa là các giá trị được yêu cầu cho các cờ tương ứng. Trong ví dụ trên, tất cả các cờ được theo sau bởi dấu hai chấm: "u: d: p: f:". Điều này có nghĩa, tất cả các cờ cần một giá trị. Ví dụ: nếu cờ "d" và "f" không được mong đợi có giá trị, thì chuỗi quang sẽ là "u: dp: f".

Dấu hai chấm ở đầu chuỗi, ví dụ ": u: d: p: f:", có nghĩa hoàn toàn khác. Nó cho phép bạn xử lý các lá cờ không được biểu diễn trong chuỗi. Trong trường hợp đó, giá trị của biến "tùy chọn" được đặt thành "?" và giá trị của "OPTARG" được đặt thành cờ không mong muốn. Cho phép bạn hiển thị thông báo lỗi phù hợp để thông báo cho người dùng về lỗi.

Các đối số không được đặt trước bởi một lá cờ được bỏ qua bởi getopts. Nếu cờ được chỉ định trong chuỗi không được cung cấp khi tập lệnh được gọi, không có gì xảy ra, trừ khi bạn đặc biệt xử lý trường hợp này trong mã của mình. Bất kỳ đối số nào không được xử lý bởi getops vẫn có thể được ghi lại với các biến $ 1, $ 2, vv thông thường.