2012-08-21 25 views
5

Điều này có thể đã được trả lời nhưng tôi sẽ hỏi nó. Tôi có hai phiên bản của một kịch bản (comp.sh) -"[]" so với "[[]]" trong vỏ Bash

#!/bin/sh 
export tDay=$(date '+%Y%m%d') 
newfile="filename_$tDay" 
filename="filename_20120821100002.csv" 
echo $newfile $filename 
if [ $filename = *$newfile* ] 
then 
    echo "Matched" 
else 
    echo "Not Matched!" 
fi 

Output: 
$ ./comp.sh 
filename_20120821 filename_20120821100002.csv 
Not Matched! 

#!/bin/sh 
export tDay=$(date '+%Y%m%d') 
newfile="filename_$tDay" 
filename="filename_20120821100002.csv" 
echo $newfile $filename 
if [[ $filename = *$newfile* ]] 
then 
    echo "Matched" 
else 
    echo "Not Matched!" 
fi 

$ comp.sh 
filename_20120821 filename_20120821100002.csv 
Matched 

Ai đó có thể giải thích cho tôi tại sao sự khác biệt?

Ngoài ra - trong những trường hợp nào cần [ ] được sử dụng so với [[ ]] và ngược lại?

+5

Câu hỏi này tương tự và có câu trả lời hay mà chỉ tới tài liệu tuyệt vời: http://stackoverflow.com/questions/669452/is-preferable-over-in-bash-scripts – malvim

Trả lời

4

test Toán tử bình đẳng chuỗi không làm bóng.

$ [ abc = *bc ] ; echo $? 
1 
$ [[ abc = *bc ]] ; echo $? 
0 
+1

Tôi có thể thấy điều đó. Nhưng tại sao, bạn có thể giải thích tại sao '[]' so với '[[]]' tạo ra sự khác biệt? – Annjawn

+1

Không, tôi không thể. Có rất nhiều điều mà hầu hết mọi người không biết, đơn giản là vì quá trình ra quyết định đưa những điều đó trở nên mờ đục. –

+0

Ok, vì vậy '[]' rõ ràng là (là) một chương trình 'kiểm tra'? – Annjawn

2

Also - under what circumstances should [ ] be used vs. [[ ]] and vice versa?

Nó phụ thuộc. Nếu bạn quan tâm đến tính di động và muốn tập lệnh shell của bạn chạy trên nhiều loại vỏ, thì bạn không bao giờ nên sử dụng [[. Nếu bạn muốn các tính năng được cung cấp bởi [[ trên một số vỏ, bạn nên sử dụng [[ khi bạn muốn các tính năng đó. Cá nhân, tôi không bao giờ sử dụng [[ vì tính di động là quan trọng đối với tôi.

+0

Nhưng cho phép nói rằng tôi không muốn sử dụng '[[]]' nhưng cũng muốn làm so sánh chuỗi con như trong mã của tôi ở trên, làm thế nào tôi làm điều đó? – Annjawn

+0

Bạn đang tìm kiếm 'if echo '$ filename" | grep -qF "$ newfile"; sau đó ... '? –

+0

giống như vậy nhưng không có 'grep'. Vì vậy, nếu tôi hiểu điều này, đây là cách duy nhất để làm cho mã của tôi tương thích với nhiều loại trình bao và tránh sử dụng '[['. – Annjawn

12

[[ là một bash được xây dựng trong và không thể được sử dụng trong tập lệnh #!/bin/sh. Bạn sẽ muốn đọc phần Conditional Commands của hướng dẫn bash để tìm hiểu các khả năng của [[. Những lợi ích chính mà mùa xuân đến tâm trí:

  • ==!= thực hiện mô hình kết hợp, do đó phía bên tay phải có thể là một mẫu glob
  • =~!~ thực hiện phù hợp với biểu thức chính quy. Các nhóm đã chụp được lưu trữ trong mảng BASH_REMATCH.
  • toán tử boolean &&||
  • không chia tách từ, vì vậy không cần trích dẫn các biến của bạn.

Hạn chế chính: tập lệnh của bạn giờ đây đặc biệt bash.

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