2012-11-29 35 views
112

Tôi đã cố gắng tìm ra whats sai với điều này, nhưng chỉ có thể không tìm nó ra ..hành unary dự kiến ​​

Đây là phần dường như nhận được một lỗi ..

elif [ $operation = "man" ]; then 
    if [ $aug1 = "add" ]; then   # <- Line 75 
    echo "Man Page for: add" 
    echo "" 
    echo "Syntax: add [number 1] [number 2]" 
    echo "" 
    echo "Description:" 
    echo "Add two different numbers together." 
    echo "" 
    echo "Info:" 
    echo "Added in v1.0" 
    echo "" 
elif [ -z $aug1 ]; then 
    echo "Please specify a command to read the man page." 
else 
    echo "There is no manual page for that command." 
fi 

tôi nhận được lỗi này:

calc_1.2: line 75: [: =: unary operator expected 
+4

Tôi nghĩ câu lệnh 'if' của bạn trên dòng 75 cần' fi'. – Steve

+3

Nếu nghi ngờ, báo giá vars. – koola

+6

@koola, 'luôn luôn' báo giá vars. – CousinCocaine

Trả lời

266

Nếu bạn biết bạn đang luôn luôn sử dụng bash, nó dễ dàng hơn để luôn luôn sử dụng khung đôi có điều kiện lệnh hợp chất [[ ... ]], thay vì áo ngực đơn Posix tương thích cket phiên bản [ ... ]. Bên trong một [[ ... ]] hợp chất, word-tách và mở rộng tên đường dẫn không áp dụng cho từ, vì vậy bạn có thể dựa vào

if [[ $aug1 == "and" ]]; 

để so sánh giá trị của $aug1 với chuỗi and.

Nếu bạn sử dụng [ ... ], bạn luôn cần phải nhớ để tăng gấp đôi biến quote như thế này:

if [ "$aug1" = "and" ]; 

Nếu bạn không trích dẫn việc mở rộng biến và biến là undefined hoặc trống rỗng, nó biến mất khỏi hiện trường của tội phạm, chỉ để lại

if [ = "and" ]; 

không phải là cú pháp hợp lệ. (Nó cũng sẽ thất bại với một thông báo lỗi khác nếu $aug1 bao gồm các khoảng trắng hoặc các siêu ký tự vỏ.)

Toán tử hiện đại [[ có nhiều tính năng đẹp khác, bao gồm cả cụm từ thông dụng.

+6

"hiện đại"? Đã không [[* luôn luôn * bị bash? Nó đã được trong vỏ Korn trong hơn hai mươi năm, và trước ngày bash. (Tôi biết ý của bạn là gì) – cdarke

-9

Bạn cũng có thể đặt giá trị mặc định cho biến, vì vậy bạn không cần phải sử dụng hai "[", số tiền đó cho hai quy trình ("[" thực sự là một chương trình) thay vì một.

Nó theo cú pháp này: $ {VARIABLE: -default}.

Toàn bộ điều phải được suy nghĩ theo cách mà giá trị "mặc định" này khác biệt với giá trị/nội dung "hợp lệ".

Nếu không thể vì lý do nào đó bạn có thể cần phải thêm một bước như kiểm tra xem có giá trị nào không, dọc theo dòng "if [-z $ VARIABLE]; sau đó echo" biến cần được điền " ", hoặc" nếu [! -z $ VARIABLE]; sau đó # mọi thứ đều ổn, hãy tiếp tục với phần còn lại của tập lệnh ".

+3

'[[' không sinh ra hai tiến trình, nó là một nội trang hệ vỏ (và '[' cũng là một nội trang của Bash). '[[' khác với '[[', xử lý '' thứ hai như một chuỗi – user123444555621

4

Thử gán giá trị cho $aug1 trước khi sử dụng giá trị trong các câu hỏi if[]; thông báo lỗi sẽ biến mất sau đó.

5

Đã cho tôi một thời gian để tìm thấy điều này nhưng lưu ý rằng nếu bạn có một lỗi khoảng cách bạn cũng sẽ nhận được các lỗi tương tự:

[: =: unary operator expected 

Đúng:

if [ "$APP_ENV" = "staging" ] 

vs

if ["$APP_ENV" = "staging" ] 

Như thường lệ, hãy cài đặt -x biến gỡ lỗi giúp tìm các mục sau:

set -x 
Các vấn đề liên quan