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?


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:


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

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.


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

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


Luar biasa begitu banyak jawaban ada di sini ..
Tobibobi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.