Отключить сервисы с preseed

Чтобы правильно определить, является ли строка (десятичным )числом, нам сначала нужно определить, что такое десятичное целое число. Простое и в то же время достаточно полное определение:

A sequence of an optional sign (+ or -) followed by no more than 18 (significant) decimal digits.

И эти шаги необходимы:

  1. Удалить все символы, не являющиеся десятичными цифрами (после знака ).
  2. Удалите все необязательные ведущие нули. Ведущие нули заставят оболочку полагать, что число является восьмеричным.
  3. Ограничение максимального размера целого числа до 18 цифр. Ниже 2 **63 -1 (макс. 64-битное целое число ).

Всего одно регулярное выражение сделает большую часть этого:

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"
1
28.07.2020, 14:46
1 ответ

Сделано с помощью late.sh

if dpkg -l | grep "apache"; then
        systemctl stop apache2.service
        systemctl disable apache2.service
fi
0
18.03.2021, 23:16

Теги

Похожие вопросы