Saya mencoba melakukan sesuatu yang cukup umum: Parse input pengguna dalam skrip shell. Jika pengguna memberikan integer yang valid, skrip melakukan satu hal, dan jika tidak valid, skrip melakukan hal lain. Masalahnya adalah, saya belum menemukan cara yang mudah (dan cukup elegan) untuk melakukan ini - saya tidak ingin memilah-milahnya satu per satu.
Saya tahu ini pasti mudah tetapi saya tidak tahu caranya. Saya bisa melakukannya dalam selusin bahasa, tetapi tidak BASH!
Dalam penelitian saya, saya menemukan ini:
Dan ada jawaban di dalamnya yang berbicara tentang regex, tetapi sejauh yang saya tahu, itu adalah fungsi yang tersedia di C (antara lain). Tetap saja, itu sepertinya jawaban yang bagus jadi saya mencobanya dengan grep, tetapi grep tidak tahu apa yang harus dilakukan dengannya. Saya mencoba -P yang di kotak saya berarti memperlakukannya sebagai PERL regexp - nada. Dasbor E (-E) juga tidak berfungsi. Dan begitu pula -F.
Hanya untuk memperjelas, saya mencoba sesuatu seperti ini, mencari output apa pun - dari sana, saya akan meretas skrip untuk memanfaatkan apa pun yang saya dapatkan. (IOW, saya mengharapkan bahwa input yang tidak sesuai tidak menghasilkan apa-apa saat baris yang valid diulang.)
snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
echo "Not an integer - nothing back from the grep"
else
echo "Integer."
fi
Bisakah seseorang mengilustrasikan bagaimana ini paling mudah dilakukan?
Terus terang, ini adalah kekurangan TEST, menurut saya. Ini harus memiliki bendera seperti ini
if [ -I "string" ] ;
then
echo "String is a valid integer."
else
echo "String is not a valid integer."
fi
[
kompatibel lamatest
;[[
adalah hal baru Bash, dengan lebih banyak operasi dan aturan kutipan yang berbeda. Jika Anda sudah memutuskan untuk tetap menggunakan Bash, lakukan[[
(ini benar-benar jauh lebih bagus); jika Anda membutuhkan portabilitas ke shell lain, hindari[[
sepenuhnya.