2012-03-12 27 views
20

Tôi rất mới để bash scripting và đang chạy vào một vấn đề khi sử dụng dấu ngoặc kép. Tôi dường như không làm cho họ hoạt động được chút nào trong Ubuntu Server 11.10. Tập lệnh của tôi bên dưới nằm trong if_test.sh.bash vấn đề khung đôi

#!/bin/bash 

if [[ "14"=="14" ]]; then 
    echo "FOO" 
fi 

Khi tôi chạy kịch bản đơn giản này đầu ra tôi nhận được là: if_test.sh: 5: [[: không tìm thấy

Dường như tôi đang chạy GNU bash phiên bản 4.2.10 sau khi chạy bash --version từ thiết bị đầu cuối. Mọi sự trợ giúp sẽ rất được trân trọng. Cảm ơn!

+0

BTW, không có khoảng trắng, điều này không so sánh từ '14' đến' 14', nó kiểm tra xem chuỗi '14 == 14' có trống không. Nó sẽ cho kết quả chính xác tương tự với '[[" 11 "==" 99 "]]', vì chuỗi đó cũng không rỗng. –

Trả lời

35

Sự cố nằm trong lời gọi tập lệnh của bạn. Bạn đang phát hành:

$ sudo sh if_test.sh 

Trên hệ thống Ubuntu, /bin/shis dash, not bash, và dash không hỗ trợ các từ khóa khung kép (hoặc không tại thời điểm gửi bài này, tôi đã không kiểm tra lại). Bạn có thể giải quyết vấn đề của bạn bằng cách gọi một cách rõ ràng bash thay vì:

$ sudo bash if_test.sh 

Ngoài ra, bạn có thể làm cho kịch bản thực thi của bạn và dựa trên shebang line:

$ chmod +x if_test.sh 
$ sudo ./if_test.sh 

Cũng lưu ý rằng, khi được sử dụng giữa dấu ngoặc vuông đôi, ==pattern matching operator, không phải là toán tử bình đẳng. Nếu bạn muốn kiểm tra sự bình đẳng, bạn có thể sử dụng -eq:

if [[ "14" -eq "14" ]]; then 
    echo "FOO" 
fi 

Hoặc double parentheses:

if ((14 == 14)); then 
    echo "FOO" 
fi 
+0

Khi tôi thử [["14" -eq "14"]] Tôi vẫn gặp lỗi tương tự. –

+0

Lạ, từ khóa '[[' đã được hỗ trợ từ phiên bản 2.02 của 'bash'. Làm thế nào bạn thực hiện kịch bản của bạn? Có lẽ bạn sẽ sử dụng một vỏ khác ... –

+0

Tôi đang thực hiện nó với: sudo sh if_test.sh –

6

Vì bạn là người mới đến kịch bản, bạn có thể không biết rằng [[ là một bashism. Bạn có thể thậm chí không biết bashism là gì, nhưng cả hai câu trả lời được đưa ra cho đến nay đang dẫn bạn xuống một con đường hướng tới một tương lai kịch bản đóng thế bằng cách thúc đẩy sử dụng của họ.

Để kiểm tra xem biến có khớp với chuỗi trong bất kỳ hương vị nào của Bourne shell hay không, bạn có thể làm test $V = 14 Nếu bạn muốn so sánh các số nguyên, hãy sử dụng test $V -eq 14. Sự khác biệt duy nhất là sau này sẽ tạo ra một lỗi nếu $ V không giống như một số nguyên. Có lý do chính đáng để trích dẫn biến (test "$V" = 14), nhưng dấu ngoặc kép thường không cần thiết và tôi tin là nguyên nhân gốc rễ của một sự nhầm lẫn phổ biến, vì "14"=="14" giống hệt với "14==14" nơi rõ ràng hơn là '==' không được sử dụng như một nhà điều hành.

Có một số điều cần lưu ý: sử dụng một đĩa đơn '=' thay vì '==' vì không phải tất cả vỏ nhận '==', lệnh [ giống hệt test nhưng đòi hỏi một cuộc tranh luận cuối cùng của ] và nhiều sh hướng dẫn mã hóa khuyên bạn nên sử dụng test vì nó thường tạo ra mã dễ hiểu hơn, [[ chỉ được nhận dạng bởi số lượng vỏ giới hạn (đây là vấn đề chính của bạn, vì vỏ của bạn dường như không nhận ra [[ và đang tìm lệnh của tên đó. là đáng ngạc nhiên nếu shebang của bạn thực sự chỉ định /bin/bash thay vì /bin/sh).

4

câu trả lời của tôi không áp dụng cho @ câu hỏi lots_of_questions của cụ thể, nhưng bạn cũng có thể chạy vào vấn đề này nếu bạn có sự xác định sai ở phía trên cùng của kịch bản của bạn:

#!/bin/sh 
if [[ ... ]] 
... 

Bạn nên thay đổi điều đó để

#!/bin/bash 
if [[ ... ]] 
... 
Các vấn đề liên quan