Чтобы правильно определить, является ли строка (десятичным )числом, нам сначала нужно определить, что такое десятичное целое число. Простое и в то же время достаточно полное определение:
A sequence of an optional sign (+ or -) followed by no more than 18 (significant) decimal digits.
И эти шаги необходимы:
Всего одно регулярное выражение сделает большую часть этого:
re='^([+-])?0*([0-9]{1,18})$'
[[ $number =~ $re ]] && integer=${BASH_REMATCH[*]:1}
Код для обработки нескольких чисел:
#!/bin/bash
DebugLevel=4 # 1:fatal 2:error 3:warn 4:info 5:debug 6:trace
SayMsg (){ local a; a=$1; shift ; # Log level
[[ $a -le $DebugLevel ]] && printf '%s' "$@" $'\n' >&2 ;
}
SayError (){ a=$1; shift; printf '%s' "$@" $'\n' >&2; exit "$a"; }
parseint (){ local re # Parse the first argument as an integer or fail
re='^([+-])?0*([0-9]{1,18})$'
[[ $1 =~ $re ]] || { SayMsg 4 "Invalid number $1"; return 2; }
integer=${BASH_REMATCH[1]}${BASH_REMATCH[2]}
echo "integer=$integer"
}
while read val; do
parseint "$val"
done <<-\_EOT_
0
1
10
100
2345
123456789012345678
923456789012345678
999999999999999999
0000000012345
+023
-00045
-76
""
''
a
abc
1234567890123456789
7.23
-8.17
1e3
10+11
_EOT_
Что напечатает:
integer=0
integer=1
integer=10
integer=100
integer=2345
integer=123456789012345678
integer=923456789012345678
integer=999999999999999999
integer=12345
integer=+23
integer=-45
integer=-76
Invalid number ""
Invalid number ''
Invalid number
Invalid number a
Invalid number abc
Invalid number 1234567890123456789
Invalid number 7.23
Invalid number -8.17
Invalid number 1e3
Invalid number 10+11
После того, как число станет чистым и ясным, единственным отсутствующим тестом будет ограничение диапазона значений. Эта простая пара строк сделает это:
(( 1 <= integer && integer <= 32 )) && REPLY="-2"
(( 33 <= integer && integer <= 48 )) && REPLY="-1"
Сделано с помощью late.sh
if dpkg -l | grep "apache"; then
systemctl stop apache2.service
systemctl disable apache2.service
fi