GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menguji apakah suatu variabel adalah angka di Bash?

Salah satu pendekatannya adalah menggunakan ekspresi reguler, seperti:

re='^[0-9]+$'
if ! [[ $yournumber =~ $re ]] ; then
   echo "error: Not a number" >&2; exit 1
fi

Jika nilainya belum tentu bilangan bulat, pertimbangkan untuk mengubah regex dengan tepat; misalnya:

^[0-9]+([.][0-9]+)?$

...atau, untuk menangani angka dengan tanda:

^[+-]?[0-9]+([.][0-9]+)?$

Tidak ada yang menyarankan pencocokan pola diperpanjang bash:

[[ $1 == ?(-)+([0-9]) ]] && echo "$1 is an integer"

atau menggunakan kelas karakter POSIX:

[[ $1 == ?(-)+([[:digit:]]) ]] && echo "$1 is an integer"

Solusi berikut juga dapat digunakan di shell dasar seperti Bourne tanpa perlu ekspresi reguler. Pada dasarnya setiap operasi evaluasi nilai numerik yang menggunakan non-angka akan menghasilkan kesalahan yang secara implisit akan dianggap salah di shell:

"$var" -eq "$var"

seperti pada:

#!/bin/bash

var=a

if [ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/null; then
  echo number
else
  echo not a number
fi

Anda juga dapat menguji $? kode pengembalian operasi yang lebih eksplisit:

[ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/null
if [ $? -ne 0 ]; then
   echo $var is not number
fi

Pengalihan kesalahan standar dilakukan untuk menyembunyikan pesan "ekspresi bilangan bulat yang diharapkan" yang dicetak oleh bash jika kita tidak memiliki nomor.

CAVEAT (berkat komentar di bawah):

  • Angka dengan titik desimal adalah bukan diidentifikasi sebagai "angka" yang valid
  • Menggunakan [[ ]] bukannya [ ] akan selalu mengevaluasi ke true
  • Sebagian besar shell non-Bash akan selalu mengevaluasi ekspresi ini sebagai true
  • Perilaku di Bash tidak terdokumentasi dan karenanya dapat berubah tanpa peringatan
  • Jika nilai menyertakan spasi setelah angka (mis. "1 a") menghasilkan kesalahan, seperti bash: [[: 1 a: syntax error in expression (error token is "a")
  • Jika nilainya sama dengan var-name (e.g. i="i"), menghasilkan error, seperti bash: [[: i: expression recursion level exceeded (error token is "i")

Tanpa bashism (berfungsi bahkan di System V sh),

case $string in
    ''|*[!0-9]*) echo bad ;;
    *) echo good ;;
esac

Ini menolak string kosong dan string yang berisi non-digit, menerima yang lainnya.

Angka negatif atau floating-point membutuhkan beberapa pekerjaan tambahan. Idenya adalah mengecualikan - / . dalam pola "buruk" pertama dan tambahkan lebih banyak pola "buruk" yang mengandung penggunaannya yang tidak tepat (?*-* / *.*.* )


Linux
  1. Skrip bash(I)

  2. Bagaimana Menggemakan Bang!?

  3. BASH:cara melakukan aritmatika pada angka dalam pipa

  1. Bagaimana Cara Membaca String Sebagai Angka Hex Di Bash?

  2. Periksa apakah ada variabel dalam daftar di Bash

  3. Bagaimana cara menghapus variabel readonly di bash?

  1. Cara menggemakan Baris Baru di Bash Shell Script

  2. Saya ingin menyimpan semua argumen baris perintah ke skrip Bash ke dalam satu variabel

  3. Linux bash:Penetapan variabel berganda