Câu hỏi Shell Script nếu có


#!/bin/bash
echo "Int. a number"
read num1
echo "Int. another numer"
read num2
if ["$num1"="$num2"]; then
echo "Equals"
else
echo "Dif"
fi
if["$num1"<0]; then
echo "The number $num1 is negative"
else if ["$num2"<0]; then
echo "The number $num2 is negative"
fi
#

mã này không hoạt động, tôi đã gặp sự cố khi tôi thấy số đó là <0.

cảm ơn


2
2018-05-30 01:11


gốc




Các câu trả lời:


Cú pháp sai. Vui lòng đọc tài liệu về [ chỉ huy (help [ / help test)

Mỗi đối số phải là một đối số của riêng nó, nghĩa là bạn phải sử dụng khoảng trắng giữa các vùng: [ "$num1" == "$num2" ]. Lý do tại sao bạn không thấy lỗi với kiểm tra đầu tiên là nó cố gắng tìm một lệnh có tên (với num1 = 3 và num2 = 4) [3==4], không tồn tại, do đó, biểu thức đánh giá sai. Tại lần kiểm tra đầu tiên, bạn đã viết <, là một toán tử shell cho chuyển hướng đầu vào. Nó cố mở tập tin 4], trong hầu hết các trường hợp không tồn tại.

Tuy nhiên khi so sánh các con số, bạn nên sử dụng -eq và tương tự, == là để so sánh chuỗi: [ 3 == 3.0 ] là sai, [ 3 -eq 3.0 ] là đúng.


5
2018-05-30 01:26



-eq, -ne, -lt, -gt, -le, -ge. xem manpage bash, phần "Biểu thức có điều kiện" - quack quixote


Trong Bash, bạn có thể so sánh số với các toán tử quen thuộc nếu bạn sử dụng đánh giá số học:

if ((num1 ==num2 ))

if ((num1<0))    # in this context, < is not evaluated as a redirection operator

else if (( $num2 < 0 ))

Như bạn thấy, tôi đã khá miễn phí với việc sử dụng không gian của tôi và có thể bỏ qua ký hiệu đô la nếu tôi muốn. Bạn nên biết điều này, tuy nhiên:

a=    # set to nothing, thus null
if (( a == 0 )); then echo "ok"; fi    # echoes "ok" since a evaluates to 0
if (( $a == 0 )); then echo "ok"; fi    # produces an error even if $a is quoted

So sánh chuỗi có thể được thực hiện bằng "<" và ">" thay vì "-lt" và "-gt" nếu bạn sử dụng dấu ngoặc vuông kép. Yêu cầu về khoảng trắng giống với yêu cầu đối với các dấu cách đơn.

s="b"
if [[ "$s" > "a" ]]
t=    # null
if [[ $t < "a" ]]    # evaluates to true

Như bạn có thể thấy trong ví dụ cuối cùng, khi sử dụng dấu ngoặc vuông kép, không cần phải trích dẫn các biến để bảo vệ chống lại khả năng thiếu hoặc không được đặt, không giống như khi sử dụng dấu ngoặc vuông đơn.


3
2018-05-30 02:50





Các toán tử bạn đang sử dụng làm so sánh chuỗi. Bạn nên sử dụng -eq cho số nguyên bình đẳng, -lt cho ít hơn, vv (chúng cũng nên được bao quanh bởi dấu cách).


2
2018-05-30 01:25