Apa cara terbaik untuk memeriksa apakah $ 1 adalah integer di / bin / dash?
Dalam bash, saya bisa melakukan:
[[ $1 =~ ^([0-9]+)$ ]]
Tapi itu tampaknya tidak sesuai dengan POSIX dan tanda hubung tidak mendukung itu
shell
regular-expression
string
dash
Martin Vegter
sumber
sumber
foo\n123\nbar
bukan bilangan bulat, tetapi akan lulus tes ini.Entah
dash
,bash
,ksh
,zsh
, POSIXsh
, atauposh
( "implementasi ulang dari Bourne shell"sh
); yangcase
membangun adalah yang paling banyak tersedia dan dapat diandalkan:sumber
dash
? Ini bekerja untuk saya di bawahbash
tetapi tidakdash
.dash
; untuk menginterogasi hasil yang saya tambahkanecho $?
setelah perintah kasus.posh
("implementasi ulang shell Bourne") juga tidak memiliki masalah dengan solusi itu.case
; salah satu alasannya adalah bug yang Anda jelaskan, satu lagi yang dalam editor yang memiliki fitur yang bergantung pada tanda kurung yang cocok (vim) memberikan dukungan yang lebih baik, dan paling tidak saya merasa secara pribadi lebih mudah dibaca untuk mencocokkannya. - WRTposh
menjadi POSIX; Yah, kutipan dari halaman manual yang saya berikan menyarankan sesuatu yang lain, tetapi orang tidak bisa mengandalkan pernyataan informal seperti itu, saya kira. Shell bourne lama tidak lagi signifikan sekarang karena kita berada di era POSIX.Anda dapat menggunakan
-eq
tes pada string, dengan sendirinya:Jika pesan kesalahan adalah masalah, redirect output kesalahan ke
/dev/null
:sumber
" 023 "
angka. Perhatikan bahwa ia bekerja dengan tanda hubung, tetapi tidak semua shell POSIX lainnya karena perilakunya tidak ditentukan jika operannya adalah bilangan desimal. Misalnya dengan ksh, itu akan mengatakan ituSHLVL
atau1+1
angka.Coba gunakan itu sebagai ekspansi aritmatika, dan lihat apakah itu berfungsi. Sebenarnya, Anda harus sedikit lebih ketat dari itu, karena ekspansi aritmatika akan mengabaikan ruang depan dan belakang, misalnya. Jadi lakukan ekspansi aritmatika, dan pastikan bahwa hasil yang diperluas cocok dengan variabel asli dengan tepat.
Ini juga akan menerima angka negatif - jika Anda bermaksud mengecualikannya, tambahkan cek tambahan untuk
$((${1} >= 0))
.sumber
[[
$(( ... ))
? Jika demikian, jawaban saya masih benar secara materi, saya hanya perlu menambahkan beberapa kutipan tambahan.check_if_number 1.2
dan fungsinya kembali:dash: 3: arithmetic expression: expecting EOF: "1.2"
Mungkin dengan
expr
?sumber
match
juga\+
adalah POSIX. Itu juga akan mengatakan 0 bukan angka. Anda inginexpr "x$1" : 'x[0-9]\{1,\}$'
Dalam sistem POSIX, Anda dapat menggunakan expr :
sumber
expr
implementasi akan mengatakan bahwa 999999999999999999999 bukan bilangan bulat. POSIX tidak memberikan jaminan bahwa ini akan berhasil. Dalam praktiknya, setidaknya pada sistem GNU, ia akan mengatakan bahwa "panjang" adalah bilangan bulat.expr 9999999999999999999 + 0
memberi saya status keluar 3 danexpr -12 + 0
danexpr length + 0
memberi saya status keluar 0 dengan GNU expr (+ string
memaksastring
untuk dianggap sebagai string dengan GNUexpr
.expr "$a" - 0
Akan bekerja lebih baik).-12
adalah integer yang valid, dan9999999999999999999
memberikan overflow.Inilah fungsi sederhana menggunakan metode yang sama dengan jawaban muru :
Contoh:
Keluaran:
sumber