Toán tử unary đơn vị dự kiến ​​lỗi lỗi trong Bash nếu điều kiện


225

Tôi đã cố gắng tìm ra những gì sai với điều này nhưng chỉ không thể tìm ra nó ..

Đây là phần dường như đang 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ĩ rằng iftuyên bố của bạn trên dòng 75 cần a fi.
Steve

7
Nếu nghi ngờ, trích dẫn vars.
koola

9
@koola, 'luôn luôn' trích dẫn vars.
CousinCocaine

Câu trả lời:


480

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

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

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

Nếu bạn sử dụng [ ... ], bạn luôn cần nhớ nhân đôi các biến như thế này:

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

Nếu bạn không trích dẫn mở rộng biến và biến không xác định hoặc trống, nó sẽ biến mất khỏi hiện trường vụ án, chỉ để lại

if [ = "and" ]; 

đó không phải là một 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 $aug1bao gồm các ký tự đại diện khoảng trắng hoặc vỏ.)

[[Toán tử hiện đại có rất nhiều tính năng hay khác, bao gồm cả kết hợp biểu thức chính quy.


9
"Hiện đại"? Không phải [[ luôn luôn bị bash? Nó đã ở trong vỏ Korn trong hơn hai mươi năm và bash trước ngày. (Tôi biết ý của bạn là gì)
cdarke

31

Mất một lúc để tìm cái này nhưng lưu ý rằng nếu bạn gặp lỗi khoảng cách, bạn cũng sẽ gặp lỗi tương tự:

[: =: unary operator expected

Chính xác:

if [ "$APP_ENV" = "staging" ]

đấu với

if ["$APP_ENV" = "staging" ]

Như luôn luôn thiết lập -xbiến gỡ lỗi giúp tìm thấy:

set -x

Ai đó đã để lại lỗi này cho tôi trong một kịch bản xây dựng. Tiết kiệm cho tôi một thời gian, cảm ơn!
Kyle

8

Hãy thử gán một giá trị $aug1trước khi sử dụng nó trong các if[]câu lệnh; thông báo lỗi sẽ biến mất sau đó.


0

bạn nói ... :

elif [$ oper = "người đàn ông"]; sau đó nếu [$ aug1 = "thêm"]; sau đó # <- Dòng 75 echo "Man Page for: add" echo "" echo "Cú pháp: add [number 1] [number 2]" echo "" echo "Mô tả:" echo "Cộng hai số khác nhau lại với nhau." echo "" echo "Thông tin:" echo "Đã thêm vào v1.0" echo "" elif [-z $ aug1]; sau đó lặp lại "Vui lòng chỉ định một lệnh để đọc trang man." echo khác "Không có trang hướng dẫn cho lệnh đó." fi

tôi nghĩ rằng đó chỉ là không gian ... làm như thế này:

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

-11

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

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

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

Nếu không thể vì một lý do nào đó, có lẽ bạn cần 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 đó lặp lại" biến cần được điền "" hoặc " nếu [! -z $ VARIABLE]; thì #everything vẫn ổ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 quá trình, nó là một shell dựng (và [cũng là một dựng sẵn Bash). [[khác với [ [, coi chuỗi thứ hai [là một chuỗi
user123444555621
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.