Saya mulai belajar tentang menulis skrip untuk terminal bash, tapi saya tidak tahu cara membuat perbandingan agar berfungsi dengan benar. Script yang saya gunakan adalah:
echo "enter two numbers";
read a b;
echo "a=$a";
echo "b=$b";
if [ $a \> $b ];
then
echo "a is greater than b";
else
echo "b is greater than a";
fi;
Masalahnya adalah bahwa ia membandingkan angka dari digit pertama aktif, yaitu 9 lebih besar dari 10, tetapi 1 lebih besar dari 09.
Bagaimana saya bisa mengubah angka menjadi tipe untuk melakukan perbandingan yang benar?
;
pada akhir baris berlebihan. Tidak ada salahnya, hanya buang-buang tombol (kecuali Anda menikmati mengetik semi-titik dua).10#$number
demikian juganumber=09; echo "$((10#$number))"
akan menampilkan9
sementaraecho $((number))
akan menghasilkan kesalahan "nilai terlalu besar untuk basis".>
operator dalam[
perintah ini adalah untuk membandingkan urutan dua string yang harus diurutkan, daripada urutan mereka akan mengurutkannya sebagai angka. Anda dapat menemukan info lebih lanjut diman test
.Jawaban:
Dalam bash, Anda harus melakukan pemeriksaan dalam konteks aritmatika :
Untuk shell POSIX yang tidak mendukung
(())
, Anda bisa menggunakan-lt
dan-gt
.Anda bisa mendapatkan daftar lengkap operator perbandingan dengan
help test
atauman test
.sumber
"$a" -gt "$b"
adalah jawaban yang tepat. Berikut ini adalah daftar operator tes yang baik: Test Constructs .test
adalah program apa adanya[
. Jadihelp test
berikan informasi tentang itu. Untuk mengetahui apa yang built-in ([[
dan((
) harus Anda gunakanhelp bash
dan arahkan ke bagian itu.Polos dan sederhana
Anda dapat memeriksa lembar contekan ini jika Anda ingin lebih banyak angka perbandingan di dunia indah Bash Scripting.
Singkatnya, bilangan bulat hanya dapat dibandingkan dengan:
sumber
"$a"
dan"$b"
tidak sepenuhnya diperlukan tetapi mereka adalah praktik yang baik. Kurung kurawal tidak melakukan hal yang berguna di sini."
wajib atau tidak apa-[ $a -eq $b ]
apa?if [[ $a -eq $b ]];then
Ada juga satu hal yang menyenangkan yang mungkin tidak diketahui oleh beberapa orang:
Kode ini akan mencetak nomor terkecil dari
a
danb
sumber
b
jikaa == b
.echo "The smaller number is $(( a < b ? a : b ))."
a < b
masih benar jikaa == b
. Saya tidak tahu semua keanehan kondisional Bash, tetapi hampir pasti ada situasi di mana ini akan membuat perbedaan.a == b
, kemudiana < b
dievaluasi menjadi false, itulah sebabnya ia akan mencetakb
.Dalam Bash saya lebih suka melakukan ini karena alamat itu sendiri lebih sebagai operasi bersyarat tidak seperti menggunakan
(( ))
yang lebih dari aritmatika.Kecuali saya melakukan hal-hal rumit seperti
Tetapi setiap orang hanya memiliki preferensi mereka sendiri. Yang menyedihkan adalah beberapa orang memaksakan standar tidak resmi mereka.
Memperbarui:
Anda sebenarnya juga dapat melakukan ini:
Yang memungkinkan Anda untuk menambahkan sesuatu yang bisa Anda lakukan
[[ ]]
selain hal-hal aritmatika.sumber
[[ ]]
memaksa konteks aritmatika seperti(( ))
, di manaN
diperlakukan seolah-olah itu$N
, tapi saya tidak berpikir itu benar. Atau, jika itu bukan niat, penggunaanN
danM
membingungkan.[[
perintah,Arg1
danArg2
dievaluasi sebagai ekspresi aritmatika [...]".NUMBER=0.0; while [[ "$NUMBER" -lt "1.0" ]]; do
dan dikatakanbash: [[: 0.0: syntax error: invalid arithmetic operator (error token is ".0")
Kode ini juga dapat membandingkan pelampung. Ini menggunakan awk (ini bukan bash murni), namun ini seharusnya tidak menjadi masalah, karena awk adalah perintah POSIX standar yang kemungkinan besar dikirimkan secara default dengan sistem operasi Anda.
Untuk membuatnya lebih singkat untuk digunakan, gunakan fungsi ini:
sumber
bash
gagal membandingkannya dengan benar (cobaif (( 18446744073692774399 < 8589934592 )); then echo 'integer overflow'; fi
).awk
bekerja seperti pesona (if awk "BEGIN {return_code=(18446744073692774399 > 8589934592) ? 0 : 1; exit} END {exit return_code}"; then echo 'no integer overflow'; fi
).Jika Anda memiliki float, Anda dapat menulis fungsi dan kemudian menggunakannya misalnya
sumber
Hal-hal braket (misalnya,
[[ $a -gt $b ]]
atau(( $a > $b ))
) tidak cukup jika Anda ingin menggunakan nomor float juga; itu akan melaporkan kesalahan sintaksis. Jika Anda ingin membandingkan angka float atau angka float dengan integer, Anda dapat menggunakan(( $(bc <<< "...") ))
.Sebagai contoh,
Anda dapat memasukkan lebih dari satu perbandingan dalam pernyataan if. Sebagai contoh,
Itu membantu jika Anda ingin memeriksa apakah variabel numerik (bilangan bulat atau tidak) berada dalam rentang numerik.
sumber
if [ "$(bc <<<"$a > $b") == "1" ]; then echo "a is greater than b; fi
if [ $(bc <<<"$a > $b") == "1" ]; then echo "a is greater than b"; fi
? (Saya pikir perintah Anda salah ditulis.) Jika demikian, itu juga berhasil. Perintah Bash Calculator (bc) adalah perintah kalkulator dasar. Beberapa contoh penggunaan lainnya ditemukan di sini dan di sini . Saya tidak tahu mengapa perintah teladan saya tidak bekerja untuk Anda.Saya memecahkan ini dengan menggunakan fungsi kecil untuk mengonversi string versi ke nilai integer biasa yang dapat dibandingkan:
Ini membuat dua asumsi penting:
Sebagai contoh
Contoh pengujian apakah
npm
perintah memenuhi persyaratan minimum ...sumber