Làm thế nào để kiểm tra nếu một biến bằng một số trong shell


12

Tôi có kịch bản shell này không hoạt động.

Đầu vào:

Server_Name=1
if [ $Server_Name=1 ]; then  
echo Server Name is 1  
else
echo Server Name is not 1
fi

Đầu ra:

Server Name is 1

Nhưng, nếu tôi thay đổi Server_Name=2, đầu ra là:

Server Name is 1

Khi tôi đổi Server_Namethành 2, tôi muốn nó nói : Server Name is 2.

Tôi biết đó là if [ $Server_Name=1 ];một phần.

Làm thế nào để tôi sửa nó?


Như David chỉ ra bên dưới, bạn phải sử dụng "-eq" để kiểm tra các giá trị số. Bạn cũng có thể muốn kiểm tra một biến trống để tránh lỗi; if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
mikebabcock

Câu trả lời:


21

Kịch bản của bạn cho biết bạn đang sử dụng so sánh chuỗi.

Giả sử tên máy chủ có thể là một chuỗi thay vì chỉ số.

Để so sánh chuỗi :
if [[ "$Server_Name" == 1 ]]; then

Ghi chú:

  • Khoảng cách xung quanh == là bắt buộc
  • Khoảng cách xung quanh = là phải
    if [ $Server_Name=1 ]; then là SAI

  • [[...]] giảm lỗi vì không có sự mở rộng tên đường dẫn hoặc phân tách từ diễn ra giữa [[và]]

  • Thích trích dẫn chuỗi là "từ"

Để so sánh số nguyên :
if [[ "$Server_Name" -eq 1 ]]; then


Thêm thông tin:


2
[[là cú pháp bash và OP đã hỏi về shell, nơi nó sẽ không hoạt động
gilad mayani


2
[ $Server_Name=1 ]

không hoạt động như dự định vì cú pháp bên trong dấu ngoặc đơn không đặc biệt đối với Bash. Như thường lệ, biến $Server_Nameđược thay thế bằng 1, vì vậy tất cả lệnh test ( [) nhìn thấy là một đối số duy nhất: chuỗi 1=1. Vì sting đó có độ dài khác không, kiểm tra trả về giá trị true .

Đối với hệ vỏ tương thích POSIX, bạn có thể sử dụng các lệnh kiểm tra sau :

[ "$Server_Name" = 1 ]

kiểm tra là $Server_Namebằng với chuỗi 1.

[ "$Server_Name" -eq 1 ]

kiểm tra là $Server_Namebằng với số 1 , nghĩa là, nó thực hiện so sánh số thay vì so sánh chuỗi.

Giá trị trả về của hai lệnh sẽ khác nhau, ví dụ, nếu bạn xác định Server_Name=01. Cái đầu tiên sẽ trả về false, cái thứ hai sẽ trả về true.

Lưu ý rằng nếu khả năng tồn tại là biến $Server_Namekhông được xác định, nó phải được trích dẫn hoặc kiểm tra sẽ hiển thị lỗi khi được gọi.


1

Thử,

 #!/bin/bash
 Server_Name=50
 if [ $Server_Name = 49 ]
 then
 echo "Server Name is 50"
 else
 echo "Server Name is below 50"
 fi

đầu ra:

 #./scriptname.sh
 Server Name is below 50

0

Câu trả lời đơn giản. Mã của bạn là chính xác - gần như. điều duy nhất bạn đang thiếu là khoảng trắng ... (và cũng có thể là thêm "=")

if [ $Server_Name=1 ]; then

sẽ không tính toán chính xác.

if [ $Server_Name == 1 ]; then  

là những gì bạn tìm kiếm.

Và bây giờ tuyên bố về chuỗi so với số. Bất cứ khi nào bạn đang tìm kiếm để so sánh như là / không-thì, == sẽ luôn ổn.

Và tôi giả sử bạn luôn có một tên máy chủ là một chuỗi, không phải là một số - phải không? ;-)

Chúc may mắn với người học việc mã hóa mạnh mẽ của bạn.

Ciao


Thật
ngạc
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.