2012-02-13 30 views
19

Đây là mã của tôi:So sánh tham số dòng lệnh để một chuỗi

#!/bin/bash 
if [ "$#" -ne 2 ] ; then 
     echo "$0: exactly 2 arguments expected" 
     exit 3 
fi 

if [$1 != "file" -a $1 != 'dir'] ; then 
     echo "$0: first argument must be string "file" or "dir"" 
     exit 1 
elif [-e $2 -a -r $2]; then 
     if ["$1" = "file" -a -f $2] ; then 
       echo YES 
     elif ["$1" = "dir" -a -d $2] ; then 
       echo YES 
     else 
       echo NO 
     fi 
     exit 0 
else 
     echo "$0: $2 is not a readable entry" 
     exit 2 
fi 

Nếu tôi chạy ./lab4 file filename1 nó sẽ kiểm tra nếu tham số đầu tiên là chuỗi "tập tin" hoặc "dir", sau đó nếu tham số đầu tiên là "file" và filename1 là một tập tin, nó sẽ in có. Cùng một điều cho dir.

Nó không nhận dạng $1$2. Mã sẽ xuất:

./lab04Q2: line 7: [file: command not found 
./lab04Q2: line 10: [-e: command not found 

mặc dù tôi đã đặt 2 tham số khi chạy chương trình.

+0

Xin chào Janson, tôi đã chỉnh sửa câu hỏi của bạn cho bạn. Trong tương lai, hãy xem xét sử dụng khoảng trống 4 khoảng trống trên bất kỳ thứ gì sẽ được coi là 'mã' trong bài đăng của bạn ở đây. –

+0

cảm ơn tôi nghĩ thụt lề có nghĩa là sử dụng tab, nhưng điều đó đã không làm việc – JA3N

Trả lời

17

(Các) sự cố xuất phát từ thực tế là [ thực sự là một lệnh. Trên thực tế, đó là bí danh cho lệnh test. Để cho tiện để chạy đúng cách, bạn sẽ cần phải thêm một không gian sau khi [ của bạn như trong:

if [ $1 != "file" -a $1 != 'dir' ] ; 

Làm điều này cho tất cả các trường hợp của bạn của [ mà không có một không gian sau nó.

P.S.

Vì bạn đang sử dụng bash làm thông dịch viên, tôi khuyên bạn nên sử dụng [[ ]] thay vì [ ] cho các bài kiểm tra của bạn trước đây có nhiều khả năng hơn sau này không có nhược điểm; không cần thiết cho một không gian là một trong số họ

+0

Và với điều đó .. bài tập về nhà của tôi được thực hiện .. Cảm ơn sự giúp đỡ của bạn. – JA3N

+0

như nếu [[$ 1! = "Tệp" -a $ 1! = 'Dir']]; ? – JA3N

+0

@JansonChung '[[]]' cho phép nhiều cú pháp C giống như vậy bạn thực sự có thể làm 'nếu [[$ 1! =" Tệp "&& $ 1! =" Dir "]]; sau đó ... ' – SiegeX

39

Thử 3 dòng sau trong bash:

if [ "a" == "a" ]; then echo hi; fi 
if ["a" == "a" ]; then echo hi; fi 
if ["a" == "a"]; then echo hi; fi 

Bạn sẽ thấy rằng chỉ có người đầu tiên hoạt động, trong khi hai người kia thì không. nghĩa là thiếu không gian của bạn là lý do tại sao biểu thức của bạn không hoạt động.

Ví dụ trên cũng gợi ý rằng bạn có thể kiểm tra cú pháp bash trực tiếp trên dấu nhắc bash. Bạn có thể làm cho nó ngay trước khi kết hợp chúng vào kịch bản của bạn.

+0

wth ... Tôi có thể mua bia cho bạn không? lol ... – user1872384

+0

Tôi đã sử dụng cách tiếp cận của bạn và đã không làm việc này không hoạt động trong trường hợp: nếu ["a" == "a"]; sau đó echo hi; fi Không có dấu cách giữa các giá trị và dấu bằng –

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