2012-01-23 31 views
51

Tôi chỉ muốn kiểm tra xem một tham số có được cung cấp trong tập lệnh bash của tôi hay không.Cách kiểm tra tham số đã được cung cấp cho tập lệnh bash

Tôi tìm thấy this, nhưng tất cả các giải pháp có vẻ phức tạp không cần thiết.

Giải pháp đơn giản cho vấn đề đơn giản này có ý nghĩa với người mới bắt đầu là gì?

+0

^câu trả lời từ bản sao có thể ở trên tương tự như câu trả lời ở đây bao gồm nhận xét về việc sử dụng [[-z]] kiểm tra – pd12

Trả lời

73

Sử dụng $# tương đương với số lượng đối số cung cấp, ví dụ .:

if [ "$#" -ne 1 ] 
then 
    echo "Usage: ..." 
    exit 1 
fi 

Lời cảnh báo: Lưu ý rằng bên trong một hàm này sẽ tương đương với số lượng đối số cung cấp cho các chức năng chứ không phải là kịch bản.

CHỈNH SỬA: Như được chỉ ra bởi SiegeX trong bash bạn cũng có thể sử dụng biểu thức số học trong ((...)). Điều này có thể được sử dụng như thế này:

if (($# != 1)) 
then 
    echo "Usage: ..." 
    exit 1 
fi 
+3

vì đây là câu hỏi 'bash' tôi sẽ đề xuất 'if (($ #! = 1))' – SiegeX

+0

Đối với một phạm vi, câu lệnh 'case' có thể thành ngữ hơn. Tuy nhiên, cú pháp có vẻ ngoài xa lạ đối với người mới bắt đầu. 'case $ # in [123]) ;; *) echo không thành công> & 2; thoát 1 ;; esac' – tripleee

+12

Biểu thức trong '[]' sử dụng '<', '> ','! = 'và' == 'để so sánh chuỗi và' -lt', '-gt',' -le', '-ge',' -ne 'và' -eq' để so sánh số học. Các biểu thức trong '(())' sử dụng '<', '>', '! =' Và '==' để so sánh số học. Để biết thêm các nhà khai thác, hãy xem [bash manpage] (http://linux.die.net/man/1/bash). –

11
if (("$#" != 1)) 
then 
    echo "Usage Info:…" 
exit 1 
fi 
+0

Cảm ơn @SiegeX .. đã cập nhật câu trả lời. Trong sự tò mò, bất kỳ sự khác biệt cụ thể nào tôi cần phải biết? –

+0

Chỉ có nó hỗ trợ cú pháp cao cấp như '==' '! =' '<' '>' '<=' '> =' và nó cũng có thể làm logic boolean bên trong một '(())' giống như bạn có thể làm trong C – SiegeX

12

Các chấp nhận kiểm tra giải pháp cho dù thông số nơi thiết bằng cách kiểm tra với số lượng các thông số nhất định. Nếu đây không phải là việc kiểm tra mong muốn, có nghĩa là, nếu bạn muốn kiểm tra thay vì cho dù một tham số cụ thể đã được thiết lập, sau đây sẽ làm điều đó:

for i in "[email protected]" ; do 
    if [[ $i == "check parameter" ]] ; then 
     echo "Is set!" 
     break 
    fi 
done 

Hoặc, gọn hơn,

for i in "[email protected]" ; do [[ $i == "check argument" ]] && echo "Is set!" && break ; done 
+1

I ' m không chắc phương pháp của bạn là chính xác… ví dụ: './script check parameter' sẽ thành công (không chính xác). –

+0

@gniourf_gniourf Bạn hoàn toàn đúng. Tôi đã chỉnh sửa bằng một giải pháp thực sự thực hiện thủ thuật. Unfortunatelly với một vòng lặp. – h7r

Các vấn đề liên quan