Làm cách nào để so sánh một biến với một chuỗi văn bản, thay vì số nguyên, trong câu lệnh if / other?


17

Trong quá trình viết tập lệnh shell, tôi gặp phải một vấn đề với câu lệnh if / other sau đây nằm ở đâu đó ở giữa tập lệnh:

if [ $act -eq "add" ]
then
    read - "add or update: " $comm
    git commit -m "$comm $file"
else
    git commit -m "$act $file"
fi

Lỗi trả về là:

./gitup: line 13: [: add: integer expression expected

và sau đó tiến hành với phần còn lại của kịch bản. Làm thế nào tôi có thể có phân đoạn if đánh giá / so sánh biến với đầu vào chuỗi thay vì số nguyên; một lỗi khác được yêu cầu khi sử dụng "! =" trong số một vài thứ khác mà tôi đã thử.

Câu trả lời:


30

Một cái gì đó như thế này:

act="add"
if [[ $act = "add" ]]
then
    echo good
else
    echo not good
fi

-eq là để so sánh số, sử dụng = để so sánh chuỗi


Cảm ơn. Tôi đã thử điều đó, và kịch bản sẽ miễn phí, yêu cầu gõ phím, nhưng chỉ thấy nó bị gây ra bởi một lỗi cú pháp không liên quan hơn nữa, vì vậy điều này hoạt động hoàn hảo. Cảm ơn đã giúp đỡ.
tony_perkis666

1
@josephmarhee: Lưu ý rằng [[]] kiểm tra là một cấu trúc cụ thể của Bash và ví dụ này hoạt động tốt với POSIX [] như được sử dụng trong câu hỏi. Nếu thông dịch viên được đưa ra rõ ràng là #!/bin/bash hoặc tương tự, [[]] có thể được sử dụng mà không có vấn đề (và nó nhanh hơn một chút so với giải pháp thay thế ở Bash , Tôi tin rằng - không phải là dù sao nó cũng nên là một cái cổ chai []. Nếu một người không cần thông tin cụ thể về Bash, kịch bản sẽ chạy nhanh hơn một chút trong ví dụ: Dấu gạch ngang. Và POSIX đảm bảo tính di động vốn có.
Daniel Andersson

3

Phương pháp này cũng sẽ làm việc. Rất giống với câu trả lời của @ Guru nhưng loại bỏ sự cần thiết cho dấu ngoặc vuông.

if [ "$act" == "add" ]
then
echo "Good!"
      else
      echo "Not good!"
fi
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.