Nếu các tùy chọn đầu vào của bạn là vị trí (bạn biết vị trí của chúng) và không được chỉ định bằng cờ, thì điều bạn muốn chỉ là xây dựng dòng lệnh. Chỉ cần chuẩn bị các đối số lệnh cho tất cả chúng:
FLAG1="--flag1 $1"
FLAG2="--flag2 $2"
OPTFLAG1=""
OPTFLAG2=""
OPTFLAG3=""
if [ xFALSE != x"$3" ]; then
OPTFLAG1="--optflag1 $3"
fi
if [ xFALSE != x"$4" ]; then
OPTFLAG2="--optflag2 $4"
fi
#the same for other flags
#now just run the program
runprogram $FLAG1 $FLAG2 $OPTFLAG1 $OPTFLAG2 $OPTFLAG3
Nếu các tham số không được chỉ định, thì các chuỗi sửa lỗi sẽ trống và mở rộng thành không có gì. Lưu ý rằng trong dòng cuối cùng, không có dấu ngoặc kép. Đó là bởi vì bạn muốn shell chia các tham số thành các từ (để đưa ra --flag1
và $1
làm đối số riêng cho chương trình của bạn). Tất nhiên, điều này sẽ sai nếu các tham số ban đầu của bạn chứa khoảng trắng. Nếu bạn là người chạy cái này, thì bạn có thể bỏ nó, nhưng nếu đó là một tập lệnh chung, nó có thể có hành vi không mong muốn nếu người dùng nhập nội dung nào đó có khoảng trắng. Để xử lý điều đó, bạn sẽ cần làm cho mã xấu hơn một chút.
Các x
tiền tố trong []
thử nghiệm là có trong trường hợp $3
hoặc $4
là rỗng. Trong trường hợp đó, bash sẽ mở rộng [ FALSE != $3 ]
thành [ FALSE != ]
lỗi cú pháp, do đó, một ký tự tùy ý khác sẽ ở đó để bảo vệ chống lại điều này. Đây là một cách rất phổ biến, bạn sẽ thấy nó trong nhiều tập lệnh.
Tôi đặt ra OPTFLAG1
và phần còn lại của chúng ""
ngay từ đầu chỉ để chắc chắn (trong trường hợp chúng được đặt thành thứ gì đó trước đó), nhưng nếu chúng không thực sự được tuyên bố trong môi trường, thì bạn không nhất thiết phải làm điều đó.
Một vài lưu ý bổ sung:
- Bạn thực sự có thể nhận các tham số theo cách tương tự như
runprogram
: với cờ. Đó là những gì John N
đang nói về. Đó là nơi getopts
trở nên hữu ích.
- Sử dụng FALSE cho mục đích đó là một chút không chuẩn và khá dài. Thông thường, người ta sẽ sử dụng một ký tự (có thể
-
) để báo hiệu một giá trị trống hoặc chỉ truyền một chuỗi trống, như ""
, nếu không thì đó không phải là giá trị hợp lệ của tham số. Chuỗi rỗng cũng làm cho bài kiểm tra ngắn hơn, chỉ cần sử dụng if [ -n "$3" ]
.
- Nếu chỉ có một cờ tùy chọn hoặc nếu chúng phụ thuộc để bạn không bao giờ có thể có OPTFLAG2, nhưng không phải là OPTFLAG1, thì bạn có thể chỉ cần bỏ qua những cờ bạn không muốn đặt. Nếu bạn sử dụng
""
cho các tham số trống, như được đề xuất ở trên, bạn vẫn có thể bỏ qua tất cả các trống rỗng.
Phương pháp này khá nhiều cách các tùy chọn được chuyển đến trình biên dịch trong Makefiles.
Và một lần nữa - nếu đầu vào có thể chứa khoảng trắng, nó sẽ trở nên xấu xí.
getopts
là những gì bạn muốn. Nếu không có điều đó, bạn có thể sử dụng một vòng lặp với câu lệnh chuyển đổi để phát hiện từng cờ, tùy chọn hoặc không.