2012-01-23 39 views
26

Tôi muốn kiểm tra xem cả hai tập tin tồn tại, nhưng tôi nhận đượcLàm cách nào để kiểm tra xem có hai tệp tồn tại không?

test.sh: line 3: [: missing `]' 

thể bất cứ ai nhìn thấy chuyện gì vậy?

#!/bin/sh 

if [ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]; then 
    echo "both exist" 
else 
    echo "one or more is missing" 
fi 
+2

Nếu bạn sử dụng 'kiểm tra' thay vì '[', vấn đề sẽ hiển nhiên hơn. "nếu test -f .ssh/id_rsa && test -f .ssh/ir_rsa.pub; thì" hoạt động tốt. –

Trả lời

33

Thử thêm một dấu ngoặc vuông bổ sung.

if [[ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]]; then 
+3

Nó đặc biệt '[[' (không có dấu cách) và không phải '[[' (có dấu cách). Vì bất cứ lý do gì khi tôi nhìn thấy câu trả lời này, tôi nghĩ rằng không gian là ổn, nhưng họ thì không! – gusterlover6

27
[ -f .ssh/id_rsa -a -f .ssh/id_rsa.pub ] && echo both || echo not 

hoặc

[[ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]] && echo both || echo not 

cũng có, nếu bạn cho các giải pháp [[ ]], có thể bạn sẽ muốn thay đổi #!/bin/sh-#!/bin/bash phù hợp với từ khóa của câu hỏi của bạn.

+0

'[[]]' cũng được hỗ trợ bởi 'ksh',' zsh' và có thể là các hệ vỏ khác. Nhưng sử dụng '#!/Bin/bash' tốt hơn' #!/Bin/sh'. – olibre

+0

@oHessling, vâng, tôi chỉ đang cố gắng hạn chế câu trả lời của tôi cho bộ vỏ được liệt kê trong câu hỏi - một trong các thẻ, phần còn lại trong dòng shebang. –

+0

Có, câu trả lời của bạn là hoàn hảo (ngắn và chính xác). Đã có chỉ thiếu một bình luận để chỉ ra một số tuân thủ vỏ. Nhưng chi tiết này không phải là câu trả lời của bạn, chỉ trong một bình luận nhỏ bên dưới ;-) Chúc mừng – olibre

11

[[ là cú pháp cụ thể bash. Đối với vỏ POSIX-tương thích, bạn cần:

[ -f file1 ] && [ -f file2 ] 
5
if [ -e .ssh/id_rsa -a -e .ssh/id_rsa.pub ]; then 
echo "both exist" 
else 
echo "one or more is missing" 
fi 

Ở đây,

-e kiểm tra chỉ tập tin là thoát hoặc not.If lối thoát hiểm, nó trở true.else, nó trả về false.

-f cũng thực hiện tương tự nhưng, kiểm tra xem tệp đã cho có phải là tệp thông thường hay không.based trên đó nó trả về giá trị đúng/sai.

Sau đó, bạn đang sử dụng & &. Do vậy, Cần hai dấu ngoặc [[..]] để thực thi. Thay vào đó, bạn có thể sử dụng toán tử -a [giống như & &] -o [giống như || nhà điều hành]. Nếu bạn cần thêm thông tin, hãy truy cập liên kết này

http://linux.die.net/man/1/bash.

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