Cara menguji apakah suatu variabel sama dengan angka dalam shell

12

Saya memiliki skrip shell yang tidak berfungsi.

Memasukkan:

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

Keluaran:

Server Name is 1

Tapi, jika saya berubah Server_Name=2, outputnya adalah:

Server Name is 1

Ketika saya mengubah Server_Nameke 2, saya ingin katakan: Server Name is 2.

Saya tahu itu if [ $Server_Name=1 ];bagiannya.

Bagaimana saya memperbaikinya?

pengguna2649805
sumber
Seperti yang ditunjukkan David di bawah, Anda harus menggunakan "-eq" untuk menguji nilai numerik. Anda mungkin juga ingin memeriksa variabel kosong untuk menghindari kesalahan; if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
mikebabcock

Jawaban:

21

Skrip Anda menunjukkan Anda menggunakan perbandingan string.

Asumsikan nama server bisa berupa string, bukan hanya angka.

Untuk perbandingan String :
if [[ "$Server_Name" == 1 ]]; then

Catatan:

  • Menjelajahi == adalah suatu keharusan
  • Spasi sekitar = adalah suatu keharusan
    if [ $Server_Name=1 ]; then SALAH

  • [[...]] mengurangi kesalahan karena tidak ada perluasan nama path atau pemisahan kata yang terjadi antara [[dan]]

  • Lebih suka mengutip string yang merupakan "kata-kata"

Untuk perbandingan Integer :
if [[ "$Server_Name" -eq 1 ]]; then


Informasi lebih lanjut:

Ivan Chau
sumber
2
[[adalah sintaks bash dan OP bertanya tentang shell, di mana itu tidak bekerja
gilad mayani
5

Coba ini:

if [ $Server_Name -eq 1 ];then
Dave
sumber
2
[ $Server_Name=1 ]

tidak berfungsi seperti yang dimaksudkan karena sintaks di dalam tanda kurung tunggal tidak khusus untuk Bash. Seperti biasa, variabel $Server_Nameakan diganti dengan 1, sehingga semua perintah test ( [) melihat adalah argumen tunggal: string 1=1. Karena sengatan itu memiliki panjang non-nol, tes mengembalikan true .

Untuk shell yang mematuhi POSIX, Anda dapat menggunakan perintah tes berikut :

[ "$Server_Name" = 1 ]

cek adalah $Server_Namesama dengan string 1.

[ "$Server_Name" -eq 1 ]

cek adalah $Server_Namesama dengan angka 1 , yaitu, ia melakukan perbandingan angka bukannya perbandingan string.

Nilai balik dari kedua perintah akan berbeda, misalnya, jika Anda mendefinisikan Server_Name=01. Yang pertama akan mengembalikan false, yang kedua akan mengembalikan true.

Perhatikan bahwa jika ada kemungkinan variabel $Server_Nametidak terdefinisi, itu harus dikutip atau tes akan menampilkan kesalahan ketika dipanggil.

Dennis
sumber
1

Mencoba,

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

keluaran:

 #./scriptname.sh
 Server Name is below 50
Ranjithkumar T
sumber
0

Jawaban sederhana Kode Anda benar - hampir. satu-satunya hal yang Anda lewatkan adalah spasi ... (dan mungkin tambahan "=")

if [ $Server_Name=1 ]; then

tidak akan menghitung dengan benar.

if [ $Server_Name == 1 ]; then  

adalah apa yang kamu cari.

Dan sekarang pernyataan tentang string versus angka. Setiap kali Anda mencari perbandingan suka / tidak, maka == akan selalu baik-baik saja.

Dan saya menganggap Anda selalu memiliki nama server sebagai string, bukan angka - benar? ;-)

Selamat mencoba magang koding Anda yang kokoh.

Ciao

Tobibobi
sumber
Luar biasa begitu banyak jawaban ada di sini ..
Tobibobi