2012-04-28 29 views
6

Tôi có câu hỏi về biểu thức kiểm tra tệp trong bash. Đây là một kịch bản đơn giản để minh họa cho câu hỏi của tôi:bash: double vs dấu ngoặc đơn trong đánh giá biểu thức kiểm tra tệp

set -x 
read -p "Enter a filename: " var1 
if [ - e $var1 ] 
then 
    echo file exists 
else 
    echo file not found 
fi 

Có ba kịch bản:

  1. Tại dấu nhắc, tôi nhập foo, mà là một tập tin tồn tại trong thư mục mà từ đó tôi chạy tập lệnh. Như dự kiến, đầu ra là file exists.
  2. Khi được nhắc, tôi nhập bar. Không có tệp như vậy tồn tại trong thư mục mà tôi đang chạy tập lệnh. Như dự kiến, đầu ra là file not found.
  3. Khi được nhắc, tôi nhấn <enter> mà không cần nhập gì cả. Đáng ngạc nhiên, đầu ra là file exists.

Nếu tôi sử dụng if [[ -e $var1 ]], khung ví dụ, đôi thay vì duy nhất, hành vi này là đúng: ngay cả trong trường hợp thứ ba, tôi nhận được file not found.

Tôi đã dán set -x ở đầu tệp để xem điều gì đang diễn ra. Với các dấu ngoặc đơn, biến được đánh giá là: '[' -e ']'. Với gấp đôi, nó được đánh giá là [[ -e '' ]]. Hay đấy. Tại sao biểu thức được đánh giá khác nhau trong hai trường hợp?

Tôi sẽ biết ơn vì lời giải thích. Xin lỗi nếu tôi thiếu điều hiển nhiên. Cảm ơn!

Trả lời

3

Vì đó là cách chúng hoạt động. [[ thông minh hơn test và phải được sử dụng trừ khi có khả năng tương thích chặt chẽ với sh.

+3

Cảm ơn Ignacio. Dựa trên câu trả lời của bạn, tôi đã tìm kiếm thêm và tìm thấy liên kết này: [link] (http://mywiki.wooledge.org/BashFAQ/031) đã giải thích rất nhiều. – verbose

+1

trang web của greycat thật tuyệt vời. Yêu cầu đọc cho người viết kịch bản bash nghiêm trọng. –

+4

Tôi mạnh mẽ không đồng ý với tuyên bố rằng [[nên được sử dụng có lợi cho kiểm tra, và sẽ tái cụm từ thành: '[[chỉ nên được sử dụng khi bạn hoàn toàn chắc chắn rằng kịch bản của bạn sẽ không bao giờ cần phải chạy dưới mức tối thiểu vỏ. ' –

6

thay đổi if [ -e "$var1" ]

Bạn có thể tìm thêm thông tin chi tiết của [][[ ]]Here

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