Bash: biểu thức số nguyên dự kiến, sử dụng đọc / kiểm tra


7

Tôi đang học những điều cơ bản về lập trình shell, vì vậy tôi đã viết một cái gì đó đơn giản như

#!/bin/bash
read var1
read var2
if [ var1 -lt var2 ]; then
    echo "var1 is lt var2"
else
    echo "var2 is lt var1"
fi

Sự hiểu biết của tôi là các biến được tháo ra trong Bash và bất kỳ biến nào cũng có thể được sử dụng như một số nguyên nếu nó chỉ chứa các chữ số. Nhưng tôi gặp lỗi "biểu thức số nguyên dự kiến" khi tôi chạy cái này ... tại sao?

Câu trả lời:


11

Trên thực tế, bạn có thể đặt một số thuộc tính trên các biến bằng cách sử dụng nội dung declare(hoặc cũ typeset). declare -i var1 var2sẽ đặt thuộc tính số nguyên trên các biến đó. Sau các bài tập cố gắng đặt các giá trị không nguyên cho các biến đó sẽ gây ra lỗi.

Nhưng vấn đề của bạn là với cú pháp. Khi sử dụng giá trị của biến, bạn phải đặt tiền tố tên của nó bằng $:

if [ "$var1" -lt "$var2" ]; then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi

Các ngoại lệ là các đánh giá số học, trong đó không cần $:

if ((var1<var2)); then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi

Như một lời cảnh báo, bên trong [.. ]luôn trích dẫn hai biến của bạn để tránh mở rộng từ làm rối cú pháp biểu thức của bạn. (Ý tôi là, bạn sẽ gặp vấn đề với các biến unset, biến chứa chuỗi rỗng và biến chứa IFSký tự.) Hoặc bạn có thể sử dụng cái mới hơn và tốt hơn [[.. ]]thay vào đó xử lý chính xác các trường hợp như vậy:

if [[ $var1 -lt $var2 ]]; then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi

Ngoài ra, [[ $var1 < $var2 ]]so sánh chuỗi , không phải so sánh số học ... [[ 11 > 2 ]]kiểm tra là sai ... [[ 11 -gt 2 ]]kiểm tra là đúng
Peter.O

@ Peter.O, bạn nói đúng. Vì tôi chỉ sử dụng đánh giá số học cho các so sánh số, tôi đã quên điều đó. Cảm ơn bạn.
manatwork

1

Bạn nên tham chiếu các biến trước khi đặt tên với $

if [ $var1 -lt $var2 ] ; then...

Và bạn nên trích dẫn các biến đó "$var1" -lt "$var2"trừ khi bạn có lý do rất chính đáng để không làm như vậy.
roaima
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.