2009-05-26 26 views
5

Vì vậy, về cơ bản tôi đang cố gắng kiểm tra các đối số được chuyển vào tập lệnh. Nếu nó có ba đối số và đối số thứ ba là 1, thì tôi muốn nó tiếp tục. Tôi cũng muốn nó tiếp tục nếu nó có bốn luận cứ và lập luận thứ ba không phải là một 1.Vấn đề kiểm tra đối số trong Bash Script

Vì vậy, về cơ bản tôi nghĩ rằng tôi chỉ có thể làm ...

if ([ $# -ne 3 ] and [ "$3" -ne "2" ]) 
then 
exit 0 
fi 

Tuy nhiên có vẻ như Bash không có và để sử dụng cho nếu, vì vậy sau đó tôi figured rằng tôi chỉ có thể sử dụng lồng nhau nếu, nhưng bây giờ nó vẫn phàn nàn. Vì vậy, đây là những gì tôi hiện có ...

if [ $# -ne 3 ] 
then 
if [ "$3" -ne "1" ] 
then 

echo "Improper number of arguments. 
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT> 

Select can be left off if you want all data (Mode=1) 
" 
exit 0 

fi 
fi 
if [ $# -ne 4 ] 
then 
if [ "$3" -ne "2" ] 
then 

echo "Improper number of arguments. 
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT> 

Select can be left off if you want all data (Mode=1) 
" 
exit 0 

fi 
fi 

Vì vậy, tôi sẽ làm gì sai? Tôi có thể không lồng nếu các câu lệnh trong Bash? Có một cách siêu zen làm điều này mà tôi đang thiếu hoàn toàn?

Cảm ơn sự giúp đỡ nào bạn có thể cho tôi.


New Vấn đề ...

Bây giờ, đối với một số lý do nào đó, các mã không làm việc ở tất cả. Không có lỗi hay gì cả, nó không hoạt động. Nó không kiểm tra số lượng đối số. Tôi đã chạy kịch bản mà không có đối số nào cả và nó chỉ bỏ qua nó giống như nó không có ở đó.

Phần lạ là tôi đã chắc chắn mã đã hoạt động hôm qua. Quay lại hôm nay, không nhiều lắm. Bất kỳ ý tưởng nào về vấn đề này là gì? (Xin lỗi, nhưng tôi phải loại bỏ các câu trả lời được chấp nhận về vấn đề này.)

if [[ $# = 3 && "$3" != "1" ]] 
then 

echo "Improper number of arguments. 
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT> 

Select can be omitted if all data is required (Mode=1) 
" 
exit 0 

fi 

if [[ $# > 4 ]] 
then 

echo "Improper number of arguments. 
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT> 

Select can be omitted if all data is required (Mode=1) 
" 
exit 0 

fi 

EDIT II:

Có một vài điều mà Bash shell không thích về kịch bản này mà tôi đang cố gắng làm. Tôi có lẽ sẽ kết thúc viết lại nó bằng một ngôn ngữ kịch bản khác và làm một vài điều nữa mà tôi có trong tâm trí cho dự án. Cảm ơn sự giúp đỡ trong mọi trường hợp.

+1

bạn đang gặp phải lỗi gì? – Glen

Trả lời

19
if [ $# -ne 3 -a "$3" -ne "1" ]; then 
    exit 0 
fi 

Để tham khảo

-a = and 
-o = or 

Hoặc, bạn chỉ có thể sử dụng sử dụng:

if [[ $# != 3 && "$3" != "1" ]]; then 
+0

Cảm ơn sự giúp đỡ. Điều này đã giúp tôi ra trên một vài kịch bản khác tôi đã làm việc trên là tốt. –

2

Xin xem:

http://bash-hackers.org/wiki/doku.php/commands/classictest#and_and_orhttp://bash-hackers.org/wiki/doku.php/syntax/ccmd/conditional_expression

Vì bạn chỉ kiểm tra các giá trị thoát/trả về bằng "if", bạn cần cung cấp một cái gì đó, ví dụ: một lệnh, cung cấp lệnh có ý nghĩa dựa trên các thử nghiệm của bạn. [là một lệnh như vậy, một khả năng khác là [[từ khóa.

Ví dụ chính xác thực tế đã được đề cập bởi scragar ở trên, tôi không muốn chỉ lặp lại chúng :)

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